您好,登錄后才能下訂單哦!
Mysql存儲過程
1.創建存儲過程語法(格式)
DELIMITER $ CREATE PROCEDURE 存儲過程名A(IN 傳入參數名a INT,IN 傳入參數名b VARCHAR(20),OUT 返回參數名c INT) BEGIN 內容.......... END $
解析:
2.存儲過程內具體語法與邏輯
A.定義變量語法:
DECLARE 變量名a 參數類型(INT,VARCHAR(20),BOOLEAN,........) [DEFAULT NULL];
注:可以在參數類型后面加 DEFAULT NULL; 來設置初始值。
B.變量賦值:
方式1(直接對變量進行賦值):
SET 定義的變量a = NEW();
方式2(sql查詢的結果直接賦值給變量):
SELECT `student`.age INTO 定義的變量a FROM `student` WHERE...........
方式3(sql查詢的結果直接賦值給多個變量):
SELECT `student`.name AS 定義的變量a,`student`.age AS 定義的變量b INTO 定義的變量a,定義的變量b FROM `student` ...............
c.邏輯判斷:
#IF判斷: IF 條件語句(3>5) THEN 條件為TRUE時執行.........; END IF; #IF ELSE判斷: IF 條件(a>0) THEN 條件為(a>0)時執行........; ELSE IF 條件(a<0) THEN 條件為(a<0)時執行.......; ELSE 其它執行.......; END IF;
D.游標,(LOOP)循環:
#例.單游標循環:create procedure my_procedure() -- 創建存儲過程 begin -- 開始存儲過程 declare my_id varchar(32); -- 自定義變量1 declare my_name varchar(50); -- 自定義變量2 DECLARE done INT DEFAULT FALSE; -- 自定義控制游標循環變量,默認false DECLARE cur CURSOR FOR ( SELECT id, name FROM t_people ); -- 定義游標并輸入結果集 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 綁定控制變量到游標,游標循環結束自動轉true OPEN cur; -- 打開游標 posLoop: LOOP -- 開始循環體,myLoop為自定義循環名,結束循環時用到 FETCH cur into my_id, my_name; -- 將游標當前讀取行的數據順序賦予自定義變量12 IF done THEN -- 判斷是否繼續循環 LEAVE posLoop; -- 結束循環 END IF; -- 自己要做的事情,在 sql 中直接使用自定義變量即可 UPDATE t_user SET c_name = my_name WHERE id = my_id and rtrim(ltrim(c_name)) = ''; -- 左右去空格 COMMIT; -- 提交事務 END LOOP posLoop; -- 結束自定義循環體 CLOSE cur; -- 關閉游標 END; -- 結束存儲過程
#例.多游標循環:create procedure my_procedure() -- 創建存儲過程begin -- 開始存儲過程 declare my_id varchar(32); -- 自定義變量1 declare my_name varchar(50); -- 自定義變量2 DECLARE done INT DEFAULT FALSE; -- 自定義控制游標循環變量,默認false DECLARE cur_1 CURSOR FOR ( SELECT id, name FROM t_people ); -- 定義游標并輸入結果集 DECLARE cur_2 CURSOR FOR ( SELECT id_2,name_2 FROM t_people_2); --定義游標并輸入結果集 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 綁定控制變量到游標,游標循環結束自動轉true OPEN cur_1; -- 打開游標 posLoop: LOOP -- 開始循環體,myLoop為自定義循環名,結束循環時用到 FETCH cur_1 into my_id, my_name; -- 將游標當前讀取行的數據順序賦予自定義變量12 IF done THEN -- 判斷是否繼續循環 LEAVE posLoop; -- 結束循環 END IF; -- 自己要做的事情,在 sql 中直接使用自定義變量即可 UPDATE ..........; --自己要做的具體操作 END LOOP posLoop; -- 結束自定義循環體 CLOSE cur_1; -- 關閉游標 SET done = FALSE; -- 因為當第一個游標遍歷完后其值被handler設置為TRUE了,如果不用set把它設置為 FALSE ,那么第二個游標就不會遍歷了。(最好是在每個打開游標的操作前都用該語句,以確保游標能真正遍歷) OPEN cur_2; -- 打開游標 posLoop_2: LOOP -- 開始循環體,myLoop為自定義循環名,結束循環時用到 FETCH cur_2 into my_id, my_name; -- 將游標當前讀取行的數據順序賦予自定義變量12 IF done THEN -- 判斷是否繼續循環 LEAVE posLoop_2; -- 結束循環 END IF; -- 自己要做的事情,在 sql 中直接使用自定義變量即可 INSERT ..........; --自己要做的具體操作 END LOOP posLoop_2; -- 結束自定義循環體 CLOSE cur_2; -- 關閉游標 END; -- 結束存儲過程
3.存儲過程的調用
#調用沒有返回值的存儲過程CALL 存儲過程名(參數.....); #調用有返回值的存儲過程(獲得返回值) CALL 存儲過程名(@aaa); SELECT @aaa;
4.刪除存儲過程
DROP PROCEDURE 存儲過程名;
5.注意事項
存儲過程中的分號(;)很重要,盡量不要省略。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。