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

MySQL LOOP 迴圈深度解析:搭配 LEAVE 與 ITERATE 實現精準流程控制

     編輯:MySQL 資料庫相關知識

MySQL 存儲過程支援三種標準迴圈結構:WHILE、LOOP、REPEAT,以及一種不建議使用的 GOTO 非標準方式。本文專注於 LOOP 迴圈的語法特性與實戰技巧,展示如何結合 LEAVE(跳出迴圈)與 ITERATE(跳過本次迭代)實現靈活的流程控制。

LOOP 迴圈基本語法

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

LOOP 本身無內建終止條件,必須在迴圈體內透過 LEAVE 語句主動跳出,否則會陷入無限迴圈。這特性使其適合「先執行、後判斷」或需多重跳出點的場景。

實戰範例:列印 1~10 之間的奇數

以下存儲過程 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            |
+-------------------------------+

關鍵邏輯解析

  1. 初始化:SET i=0,迴圈入口前先遞增至 1
  2. 終止條件:IF i>=10 THEN LEAVE loop1 — 當變數達到 10 時跳出迴圈
  3. 過濾偶數:ELSEIF MOD(i,2)=0 THEN ITERATE loop1 — 偶數直接跳過本次迭代,不執行後續 SELECT
  4. 輸出奇數:僅奇數會執行到 SELECT CONCAT(...)

三種迴圈對比與選擇建議

迴圈類型判斷時機適用場景備註
WHILE先判斷後執行明確知道迴圈次數或條件預檢最常用
REPEAT先執行後判斷至少需執行一次的邏輯類似 do-while
LOOP無內建判斷複雜多出口、需精細控制流程需配合 LEAVE/ITERATE

最佳實踐提醒

  • 務必設定終止條件:避免無限迴圈導致資料庫阻塞
  • 善用標籤:巢狀迴圈時,標籤能精準控制 LEAVE/ITERATE 目標層級
  • 效能考量:大量資料處理優先考慮集合操作(INSERT ... SELECT、JOIN)而非逐行迴圈
  • 除錯技巧:在迴圈關鍵點加入 SELECT 輸出變數值,觀察執行流程

總結

LOOP 迴圈雖語法簡單,但配合 LEAVE 與 ITERATE 能實現極為靈活的流程控制。掌握三種迴圈的差異與適用場景,能讓你在編寫 MySQL 存儲過程時更得心應手。

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