MySQL儲存過程中的三種迴圈方式
阿新 • • 發佈:2019-01-24
“明月別枝驚鵲,清風半夜鳴蟬”
最近儲存過程寫得多,迴圈多數用在遊標裡,在這裡總結幾種迴圈的方式
CREATE DEFINER=`root`@`localhost` PROCEDURE `NewProc`()
BEGIN
DECLARE startDate VARCHAR(20);
DECLARE endDate VARCHAR(20);
declare i int;
declare j int;
set i=0;
set j=0;
#定義開始時間
set startDate = '20180829';
#定義結束時間
set endDate = "20180831";
-- 第一種,while迴圈
while i < 3 do
select i;
-- i+1
set i = i +1;
end while;
-- 第二種,repeat迴圈
REPEAT
select j;
set j = j +1;
UNTIL j > 3
END REPEAT;
-- 第三種,loop迴圈
test_loop: LOOP
select startDate;
#開始時間加一天
set startDate = DATE_FORMAT(date_add(startDate,interval 1 day),"%Y%m%d");
IF startDate>endDate THEN
LEAVE test_loop;
END IF;
END LOOP test_loop;
END
再來看下,在遊標中如何使用迴圈:
CREATE DEFINER=`root`@`localhost` PROCEDURE `NewProc`()
BEGIN
#定義變數用於儲存查詢結果
declare temp_id varchar(30);
#這個用於處理遊標到達最後一行的情況
DECLARE done INT DEFAULT 0;
#宣告遊標cursor_name(cursor_name是個多行結果集)
DECLARE cursor_three CURSOR FOR
SELECT
id
FROM
test_id;
#設定一個終止標記(如果不要這句,會出現1329 - No data - zero rows fetched, selected, or processed錯誤資訊)
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
#開啟遊標
OPEN cursor_three;
#開始迴圈,判斷是否遊標已經到達了最後作為迴圈條件
REPEAT
#獲取遊標當前指標的記錄,讀取一行資料並傳給變數a,b
fetch cursor_three into temp_id;
#輸出查出來的ID
select temp_id;
UNTIL done
END REPEAT;
#關閉遊標
CLOSE cursor_three ;
END
test_id
這張表只有5條資料:
這個遊標的儲存過程輸出結果為: