1. 程式人生 > >MySQL儲存過程中的三種迴圈方式

MySQL儲存過程中的三種迴圈方式

“明月別枝驚鵲,清風半夜鳴蟬”
最近儲存過程寫得多,迴圈多數用在遊標裡,在這裡總結幾種迴圈的方式

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條資料:
這裡寫圖片描述
這個遊標的儲存過程輸出結果為:
這裡寫圖片描述