最近在項目開發中,有段邏輯處理,需要在網站,app,后台分別運行,這樣給后期的維護帶來了很大的不方便,容易遺漏app端或者后台,所以講java代碼轉換成存儲過程,把邏輯處理寫在了mysql端,其中遇到游標,事務的處理。問題並不困難,只是容易忘記,做了一下總結:
DECLARE err INT DEFAULT 0;#聲明一個整形變量err,默認值是0
DECLARE orderDone INT DEFAULT FALSE;-- 遍歷游標結束標識
DECLARE cur_order CURSOR FOR SELECT id,uid,productid,amount FROM p_order WHERE state=0 AND orderno=i_orderNo LIMIT 0,1; -- 游標的創建
DECLARE CONTINUE HANDLER FOR NOT FOUND SET orderDone=true; -- 綁定游標結束標識(該程序中沒有使用到)
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;#當sqlexception handler捕捉到異常時,設置err=1
pro_begin:BEGIN -- 為了跳出做的准備
START TRANSACTION;-- 開始事務(創建事務點)
-- 從中取值
OPEN cur_order ; -- 打開游標
FETCH cur_order INTO intId,intUid,intPid,intOAmount; -- 使用游標
CLOSE cur_order; --關閉游標
以上是游標簡單用法,因為只取第一個值,所以沒有用到循環取值,游標的基本使用流程:定義游標,打開,使用,關閉
IF num>0 THEN
SET o_result = 3; -- 手機號已存在
LEAVE pro_begin; -- 此處是跳出存儲過程,不繼續執行
END IF;
以下是事務的回滾和提交,一般寫於存儲過程最后。
IF err = 1 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
end;