MySQL 存儲過程支援三種標準迴圈結構:WHILE、LOOP、REPEAT,以及一種不建議使用的 GOTO 非標準方式。本文專注於 LOOP 迴圈的語法特性與實戰技巧,展示如何結合 LEAVE(跳出迴圈)與 ITERATE(跳過本次迭代)實現靈活的流程控制。
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 本身無內建終止條件,必須在迴圈體內透過 LEAVE 語句主動跳出,否則會陷入無限迴圈。這特性使其適合「先執行、後判斷」或需多重跳出點的場景。
以下存儲過程 myProc 示範 LOOP 搭配條件判斷的典型用法:
mysql> delimiter $$
mysql> CREATE PROCEDURE myProc()
-> BEGIN
-> DECLARE i int;
-> SET i=0;
-> loop1: LOOP
-> SET i=i+1;
-> IF i>=10 THEN
-> LEAVE loop1;
-> ELSEIF MOD(i,2)=0 THEN
-> ITERATE loop1;
-> END IF;
-> SELECT CONCAT(i,' is an odd number');
-> END LOOP loop1;
-> END$$
Query OK, 0 rows affected (0.02 sec)
mysql> delimiter ;
mysql> call myProc();
+-------------------------------+
| CONCAT(i,' is an odd number') |
+-------------------------------+
| 1 is an odd number |
| 3 is an odd number |
| 5 is an odd number |
| 7 is an odd number |
| 9 is an odd number |
+-------------------------------+
SET i=0,迴圈入口前先遞增至 1IF i>=10 THEN LEAVE loop1 — 當變數達到 10 時跳出迴圈ELSEIF MOD(i,2)=0 THEN ITERATE loop1 — 偶數直接跳過本次迭代,不執行後續 SELECTSELECT CONCAT(...)| 迴圈類型 | 判斷時機 | 適用場景 | 備註 |
|---|---|---|---|
| WHILE | 先判斷後執行 | 明確知道迴圈次數或條件預檢 | 最常用 |
| REPEAT | 先執行後判斷 | 至少需執行一次的邏輯 | 類似 do-while |
| LOOP | 無內建判斷 | 複雜多出口、需精細控制流程 | 需配合 LEAVE/ITERATE |
LEAVE/ITERATE 目標層級INSERT ... SELECT、JOIN)而非逐行迴圈SELECT 輸出變數值,觀察執行流程LOOP 迴圈雖語法簡單,但配合 LEAVE 與 ITERATE 能實現極為靈活的流程控制。掌握三種迴圈的差異與適用場景,能讓你在編寫 MySQL 存儲過程時更得心應手。