首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 存儲過程 WHILE 循環實戰:標籤控制流與條件跳過

     編輯:MySQL 資料庫相關知識

WHILE 循環語法

[label:] WHILE condition DO
  statements
END WHILE [label];
  • label:可選標籤,配合 LEAVE label(跳出)、ITERATE label(跳過本次進入下次)使用
  • condition:布爾表達式,為真則執行循環體

完整示例:輸出 1-10 中的奇數

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      |
+-------------------------+

進階控制流:LEAVE / ITERATE

提前退出循環

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 精確控制目標循環層級。

對比:REPEAT / LOOP

循環類型語法特點適用場景
WHILEWHILE cond DO ... END WHILE先判斷後執行,可能零次已知邊界條件,標準迭代
REPEATREPEAT ... UNTIL cond END REPEAT先執行後判斷,至少一次至少需執行一次的場景
LOOPLOOP ... END LOOP無條件無限循環,需內部 LEAVE複雜退出條件、狀態機

性能與最佳實踐

  1. 避免大循環:存儲過程循環處理萬行以上數據極慢,優先用集合操作(單條 SQL)或應用層批量處理
  2. 游標 + 循環:逐行處理時使用 DECLARE CURSOR + FETCH + WHILE,注意 NOT FOUND 處理器
  3. 變量初始化:循環變量必須在循環前 DECLARE ... DEFAULT
  4. 防死循環:確保循環體內變量朝著終止條件變化

總結

MySQL 存儲過程 WHILE 循環核心要素:標籤管理嵌套層級、條件判斷控制入口、LEAVE/ITERATE 精準控制流向。結合游標實現逐行處理,配合 NOT FOUND 處理器優雅結束,是存儲過程中實現複雜流程控制的基礎工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved