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

MySQL 存儲過程游標循環中 CONTINUE 與 LEAVE 實戰技巧

     編輯:MySQL 資料庫相關知識

游標循環三種寫法對比

循環類型語法結構流程控制關鍵字
REPEATREPEAT ... UNTIL condition END REPEAT無內建,需條件跳出
WHILEWHILE condition DO ... END WHILE無內建,需條件跳出
LOOPlabel: LOOP ... END LOOPITERATE label / LEAVE label

結論:需精細控制(跳過/退出)時必須用 LOOP,配合標籤實現 CONTINUE/BREAK 語義。

完整範例:處理游標數據,跳過條件不滿足的行

DELIMITER $$
CREATE PROCEDURE process_cursor_demo()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE v_id INT;
    DECLARE v_name VARCHAR(50);
    DECLARE cur CURSOR FOR SELECT id, name FROM source_table WHERE status = 1;
    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;          -- 等同 BREAK:游標耗盡,退出循環
        END IF;

        -- 業務邏輯:某類型跳過
        IF v_name LIKE 'skip_%' THEN
            ITERATE read_loop;        -- 等同 CONTINUE:跳過本次剩餘邏輯,直接 FETCH 下一行
        END IF;

        -- 正常處理邏輯
        INSERT INTO target_table (id, name, processed_at) VALUES (v_id, v_name, NOW());
    END LOOP;
    CLOSE cur;
END $$
DELIMITER ;

關鍵點解析

  1. 標籤命名:read_loop: 必須唯一,巢狀游標時區分層級
  2. ITERATE label:跳至 LOOP 開頭,重新評估 FETCH,若游標已盡則觸發 NOT FOUND 處理器
  3. LEAVE label:直接跳出整個 LOOP 塊,執行 CLOSE cur
  4. DECLARE CONTINUE HANDLER FOR NOT FOUND:游標讀完的標準退出機制,避免報錯

WHILE/REPEAT 變通寫法(不推薦複雜邏輯)

-- WHILE 版:需額外標誌位
SET done = FALSE;
WHILE NOT done DO
    FETCH cur INTO v_id, v_name;
    IF done THEN SET skip = TRUE; ELSE SET skip = FALSE; END IF;
    IF NOT skip AND v_name NOT LIKE 'skip_%' THEN
        INSERT ...
    END IF;
END WHILE;

碼冗長、易出錯,複雜流程請堅持用 LOOP + 標籤。

官方文檔參考

MySQL 8.0 LOOP Statement

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