[label:] WHILE condition DO
statements
END WHILE [label];
label:可選標籤,配合 LEAVE label(跳出)、ITERATE label(跳過本次進入下次)使用condition:布爾表達式,為真則執行循環體DELIMITER $$
CREATE PROCEDURE `sp_while_demo`()
BEGIN
DECLARE i INT DEFAULT 1;
loop_label: WHILE i <= 10 DO
IF MOD(i, 2) <> 0 THEN -- 奇數
SELECT CONCAT(i, ' is an odd number') AS result;
END IF;
SET i = i + 1;
END WHILE loop_label;
END$$
DELIMITER ;
CALL sp_while_demo();
+-------------------------+
| result |
+-------------------------+
| 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 |
+-------------------------+
WHILE i <= 100 DO
IF i > 50 THEN
LEAVE loop_label; -- 直接跳出整個循環
END IF;
-- 業務邏輯
SET i = i + 1;
END WHILE;
WHILE i <= 10 DO
SET i = i + 1;
IF i % 2 = 0 THEN
ITERATE loop_label; -- 跳過偶數,直接進入下次循環判斷
END IF;
-- 僅處理奇數邏輯
SELECT CONCAT('Processing odd: ', i);
END WHILE;
outer_loop: WHILE i <= 3 DO
inner_loop: WHILE j <= 3 DO
IF i = 2 AND j = 2 THEN
LEAVE outer_loop; -- 直接跳出外層循環
END IF;
SET j = j + 1;
END WHILE inner_loop;
SET i = i + 1;
END WHILE outer_loop;
關鍵:標籤名稱在存儲過程內唯一,LEAVE/ITERATE 精確控制目標循環層級。
| 循環類型 | 語法 | 特點 | 適用場景 |
|---|---|---|---|
| WHILE | WHILE cond DO ... END WHILE | 先判斷後執行,可能零次 | 已知邊界條件,標準迭代 |
| REPEAT | REPEAT ... UNTIL cond END REPEAT | 先執行後判斷,至少一次 | 至少需執行一次的場景 |
| LOOP | LOOP ... END LOOP | 無條件無限循環,需內部 LEAVE | 複雜退出條件、狀態機 |
DECLARE CURSOR + FETCH + WHILE,注意 NOT FOUND 處理器DECLARE ... DEFAULTMySQL 存儲過程 WHILE 循環核心要素:標籤管理嵌套層級、條件判斷控制入口、LEAVE/ITERATE 精準控制流向。結合游標實現逐行處理,配合 NOT FOUND 處理器優雅結束,是存儲過程中實現複雜流程控制的基礎工具。