MySQL 儲存過程及遊標使用
阿新 • • 發佈:2019-01-31
一、儲存過程建立1.1、語法[DELIMITER $$ ] --宣告結束符號,mysql預設;為語句結束符,這裡聲明後當儲存過程遇到$$才結束。CREATE PROCEDURE pro_name ([[ IN |OUT | INOUT ] 引數名 資料類形...]) --pro_name過程名,in、out、inout為過程引數後面例子介紹BEGIN --過程體END[$$]1.2、建立user表資料如下1.3、引數1.3.1、IN引數 輸入引數(可做查詢條件):表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值設定引數呼叫:
結果及解釋:a、定義userName='lisi'呼叫過程查出name為lisi的記錄。
b、過程中通過set改變userName引數的值,查詢為改變後的值。
c、過程解釋再查詢userName,結果為'lisi',及修改後變數值不會被返回。
1.3.2、OUT引數 輸出引數,用於接受返回結果(無法在呼叫時指定,其值可在儲存過程中改變,並將改變後的值返回。)
呼叫:
結果及解釋:a、定義值無法傳入,第一條查詢結果為null。
b、在過程中設值後,開始有值,且值可返回。 1.3.3、 INOUT引數 輸入輸出引數:呼叫時指定,並且可被改變和返回。(可做查詢條件也可做結果返回)
呼叫:
結果及解釋:a、傳入可直接接受
b、作為其他語句的條件直接使用
c、在過程中改變值,並返回到過程外
1.4 儲存過程刪除語法: DROP PROCEDURE IF EXISTS pro_name;二、儲存過程使用遊標2.1 簡單遊標使用例:定義如下儲存過程
呼叫: CALL test_cursor();
name為lisi的記錄已改為lisi1.2.2 多遊標及遊標巢狀使用例:定義的過程如下
結果及解釋:a、定義userName='lisi'呼叫過程查出name為lisi的記錄。
b、過程中通過set改變userName引數的值,查詢為改變後的值。
c、過程解釋再查詢userName,結果為'lisi',及修改後變數值不會被返回。
1.3.2、OUT引數 輸出引數,用於接受返回結果(無法在呼叫時指定,其值可在儲存過程中改變,並將改變後的值返回。)
呼叫:
結果及解釋:a、定義值無法傳入,第一條查詢結果為null。
b、在過程中設值後,開始有值,且值可返回。
呼叫:
結果及解釋:a、傳入可直接接受
b、作為其他語句的條件直接使用
c、在過程中改變值,並返回到過程外
1.4 儲存過程刪除語法: DROP PROCEDURE IF EXISTS pro_name;二、儲存過程使用遊標2.1 簡單遊標使用例:定義如下儲存過程
呼叫: CALL test_cursor();
name為lisi的記錄已改為lisi1.2.2 多遊標及遊標巢狀使用例:定義的過程如下
DELIMITER $$ CREATE PROCEDURE test_cursor() BEGIN /*定義變數*/ DECLARE userId Long; DECLARE userName VARCHAR(255); DECLARE userAge INT; -- 定義迴圈標識,預設值為 FALSE DECLARE done INT DEFAULT FALSE; -- 定義遊標 DECLARE My_Cursor CURSOR FOR (SELECT id,`name`,age FROM user); DECLARE My_Cursor2 CURSOR FOR (SELECT id,`name`,age FROM user WHERE id in(3,4)); DECLARE My_Cursor3 CURSOR FOR (SELECT id,`name`,age FROM user WHERE id=userId); -- 將結束標誌繫結到遊標,若沒有資料返回,程式繼續,並將變數done設為TRUE DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 開啟遊標 OPEN My_Cursor; myLoop : LOOP -- 循環遊標中的資料,並賦值到變數中 FETCH My_Cursor INTO userId,userName,userAge; IF done THEN LEAVE myLoop; ELSE IF userName='lisi' THEN UPDATE user SET `name`='lisi1' WHERE id=userId; END IF; END IF; COMMIT; END LOOP myLoop; CLOSE My_Cursor; -- 開始第二個遊標時先將 done 置為 FALSE SET done = FALSE; -- 開啟遊標 OPEN My_Cursor2; myLoop2 : LOOP -- 循環遊標中的資料,並賦值到變數中 FETCH My_Cursor2 INTO userId,userName,userAge; IF done THEN LEAVE myLoop2; ELSE OPEN My_Cursor3; myLoop3 : LOOP FETCH My_Cursor3 INTO userId,userName,userAge; IF done THEN LEAVE myLoop3; ELSE UPDATE user SET `name`=CONCAT(userName,'1','2') WHERE id=userId; END IF; COMMIT; END LOOP myLoop3; CLOSE My_Cursor3; -- 巢狀使用是內部遊標結束後給done置 FALSE SET done=FALSE; END IF; END LOOP myLoop2; CLOSE My_Cursor2; END $$
呼叫後的結果: