| 循環類型 | 語法結構 | 流程控制關鍵字 |
|---|---|---|
| REPEAT | REPEAT ... UNTIL condition END REPEAT | 無內建,需條件跳出 |
| WHILE | WHILE condition DO ... END WHILE | 無內建,需條件跳出 |
| LOOP | label: LOOP ... END LOOP | ITERATE 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 ;
read_loop: 必須唯一,巢狀游標時區分層級ITERATE label:跳至 LOOP 開頭,重新評估 FETCH,若游標已盡則觸發 NOT FOUND 處理器LEAVE label:直接跳出整個 LOOP 塊,執行 CLOSE curDECLARE CONTINUE HANDLER FOR NOT FOUND:游標讀完的標準退出機制,避免報錯-- 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 + 標籤。