| 循環類型 | 語法關鍵字 | 判斷時機 | 適用場景 |
|---|---|---|---|
| WHILE | WHILE ... DO ... END WHILE | 前置判斷 | 已知條件、可能零次執行 |
| REPEAT | REPEAT ... UNTIL ... END REPEAT | 後置判斷 | 至少執行一次 |
| LOOP | label: LOOP ... END LOOP | 無內建判斷 | 複雜流程配合 LEAVE/ITERATE |
不推薦: GOTO 導致邏輯跳躍難維護。
MySQL 預設分隔符 ; 會讓客戶端逐條發送語句。存儲過程包含多條語句,需臨時改用其他分隔符(如 $$、//),定義結束後恢復 ;。
DELIMITER $$ CREATE PROCEDURE demo() BEGIN ... END $$ DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS wk;
CREATE PROCEDURE wk()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i < 11 DO
INSERT INTO user_profile (uid) VALUES (i);
SET i = i + 1;
END WHILE;
END $$
DELIMITER ;
CALL wk();
DELIMITER //
DROP PROCEDURE IF EXISTS looppc;
CREATE PROCEDURE looppc()
BEGIN
DECLARE i INT DEFAULT 1;
REPEAT
INSERT INTO user_profile_company (uid) VALUES (i + 1);
SET i = i + 1;
UNTIL i >= 20
END REPEAT;
END //
DELIMITER ;
CALL looppc();
DELIMITER $$
DROP PROCEDURE IF EXISTS lopp;
CREATE PROCEDURE lopp()
BEGIN
DECLARE i INT DEFAULT 1;
lp1: LOOP
IF i > 30 THEN
LEAVE lp1; -- 等同 break,跳出整個循環
END IF;
SET i = i + 1;
IF (i % 3) = 0 THEN
ITERATE lp1; -- 等同 continue,跳過本次剩餘邏輯
END IF;
INSERT INTO user_profile (uid) VALUES (i);
END LOOP;
END $$
DELIMITER ;
LEAVE label:立即退出標籤標識的循環/塊(類似 break)ITERATE label:跳過本次迭代剩餘部分,直接進入下一次判斷(類似 continue)DECLARE var TYPE [DEFAULT val]; 必須置於 BEGIN 之後、首條執行語句之前@var 無需聲明,跨會話可見(實為會話級全局)@@global.var / @@session.varCREATE PROCEDURE proc_name ([IN|OUT|INOUT] param_name type)
BEGIN
-- 宣告區
DECLARE var1 INT DEFAULT 0;
-- 執行區
SELECT COUNT(*) INTO var1 FROM table;
-- 返回
SELECT var1;
END
調用:CALL proc_name();(括號不可省略)