MySQL 預存過程支援 WHILE 循環,配合變數與條件判斷可實現批量資料生成、周期性維護等邏輯。
[label:] WHILE condition DO
statements
END WHILE [label];
label 可選,用於 LEAVE label 跳出循環或 ITERATE label 進入下一次迭代。condition 為真則持續循環。DELIMITER $$
CREATE PROCEDURE print_odd_numbers()
BEGIN
DECLARE i INT DEFAULT 1;
loop_odd: WHILE i <= 10 DO
IF MOD(i, 2) <> 0 THEN
SELECT CONCAT(i, ' is an odd number') AS msg;
END IF;
SET i = i + 1;
END WHILE loop_odd;
END$$
DELIMITER ;
CALL print_odd_numbers();
+----------------------+
| msg |
+----------------------+
| 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 |
+----------------------+
DECLARE cur CURSOR FOR SELECT ...; OPEN cur; FETCH cur INTO var; WHILE done=0 DO ... FETCH cur INTO var; END WHILE; CLOSE cur;PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;DECLARE CONTINUE HANDLER FOR SQLEXCEPTION ... 捕獲錯誤並記錄,避免整個過程中斷。INSERT,改用批量 INSERT ... VALUES (),(),() 或載入臨時表再 INSERT ... SELECT。