首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 預存程序游標循環控制:ITERATE 與 LEAVE 詳解

     編輯:MySQL 綜合教學

在 MySQL 預存程序中操作游標時,常需在循環中實現「跳過本次迭代」或「跳出整個循環」的邏輯。MySQL 提供了 ITERATE(對應 CONTINUE)與 LEAVE(對應 BREAK)標籤語句,但僅能在具名的循環結構中使用。本文詳細說明三種循環結構的語法與游標控制實戰技巧。

MySQL 三種循環結構語法比較

1. REPEAT 循環(後測試)

REPEAT
    Statements;
UNTIL expression
END REPEAT;

2. WHILE 循環(前測試)

WHILE expression DO
    Statements;
END WHILE;

3. LOOP 循環(無條件,需配合標籤控制流程)

loop_label: LOOP
    Statements;
    IF condition THEN
        LEAVE loop_label;    -- 跳出循環
    END IF;
    IF skip_condition THEN
        ITERATE loop_label;  -- 跳過本次,進入下一次
    END IF;
    Statements;
END LOOP;

關鍵控制語句詳解

語句對應關鍵字作用使用限制
LEAVE labelBREAK立即跳出指定標籤的循環/區塊需在標籤作用域內
ITERATE labelCONTINUE結束本次迭代,直接進入下一次循環判斷需在標籤作用域內,僅限 LOOP、REPEAT、WHILE

實戰範例:游標處理與流程控制

DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT id, name FROM users;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;

read_loop: LOOP
    FETCH cur INTO v_id, v_name;
    IF done THEN
        LEAVE read_loop;          -- 資料讀完,跳出循環
    END IF;

    IF v_id % 2 = 0 THEN
        ITERATE read_loop;        -- 偶數 ID 跳過處理
    END IF;

    -- 處理奇數 ID 的業務邏輯
    UPDATE stats SET cnt = cnt + 1 WHERE user_id = v_id;
END LOOP;

CLOSE cur;

常見錯誤與注意事項

  • 標籤命名:標籤需唯一,建議採用 xxx_loop 命名慣例。
  • HANDLER 宣告順序:必須在變數、游標宣告之後,否則會報錯。
  • 多游標重置:使用同一個 done 變數控制多個游標時,每次 OPEN 新游標前務必 SET done = FALSE,否則第二個游標不會執行。
  • ITERATE 位置:置於需跳過的邏輯之前,置後會導致無效。

巢狀循環與 BEGIN...END 區塊

若需在同一預存程序處理多個獨立游標,可使用 BEGIN ... END 區塊隔離變數作用域,各自宣告獨立的 done 變數,避免互相干擾:

BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur_1 CURSOR FOR ...;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    -- 處理第一個游標
END;

BEGIN
    DECLARE done INT DEFAULT FALSE;  -- 獨立變數
    DECLARE cur_2 CURSOR FOR ...;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    -- 處理第二個游標
END;

掌握 ITERATE 與 LEAVE 的正確用法,能讓游標邏輯更清晰、可控,避免無限循環或漏處理資料的風險。

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