mysql8 官方文檔中明確說明不支持for 循環
MySQL does not support FOR
loops.
mysql的循環寫法有以下3種
下面的三種存儲過程的循環寫法都能實現向test表中插入(p1,10)之間的數據。p1作為存儲過程的傳入參數存在。
create table test (id int);
1. loop 語句
語法:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
離開循環體,使用leave 或者return,使用return會直接退出存儲過程。
delimiter //
CREATE PROCEDURE p_test(p1 INT)
BEGIN
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN
insert into test values(p1);
ITERATE label1; --重復執行標簽為label1的循環體END IF;
LEAVE label1;
END LOOP label1;
END;
//
delimiter ;call doiterate(2);
mysql> select * from test;
+------+
| id |
+------+
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+------+
上面程序的等價寫法。
delimiter //
CREATE PROCEDURE p_test(p1 INT)
BEGIN
label1: LOOPSET p1 = p1 + 1;
IF p1 >=10 THEN
LEAVE label1;
END IF;
insert into test values(p1);ITERATE label1;
END LOOP label1;
END;
//
delimiter ;
loop語句中需要iterate 與 leave 語句的配合使用。
2.while 語句
語法:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
delimiter //
CREATE PROCEDURE p_test(p1 INT)
BEGIN
set p1=p1+1;
while p1<10 do
insert into test values(p1);
SET p1 = p1 + 1;
end while;END;
//
delimiter ;
3. repeat 語句
語法:
[begin_label:] REPEAT
statement_list
UNTIL search_condition END REPEAT [end_label]
delimiter //
CREATE PROCEDURE p_test(p1 INT)
BEGIN
set p1=p1+1;
repeat
insert into test values(p1);
SET p1 = p1 + 1;
until p1>=10 end repeat;END;
//
delimiter ;