循环
mysql中循环有3种写法
1. while:类似于java中的while循环
2. repeat:类似于java中的do while循环
3. loop:类似于java中的while(true)死循环,需要在内部进⾏控制。
循环控制
对循环内部的流程进⾏控制,如:
结束本次循环
类似于java中的continue
iterate 循环标签;
退出循环
类似于java中的break
leave 循环标签;
下⾯我们分别介绍3种循环的使⽤。
while循环
类似于java中的while循环。语法
[标签:]while 循环条件 do
循环体
end while [标签];
标签:是给while取个名字,标签和iterate、leave结合⽤于在循环内部对循环
进⾏控制:如:跳出循环、结束本次循环。
注意:这个循环先判断条件,条件成⽴之后,才会执⾏循环体,每次执⾏都会先
进⾏判断。
示例1:⽆循环控制语句
根据传⼊的参数v_count向test1表插⼊指定数量的数据。
/*删除test1表记录*/
DELETE FROM test1;
/*删除存储过程*/
DROP PROCEDURE IF EXISTS proc3;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程*/
CREATE PROCEDURE proc3(v_count int)
BEGIN
DECLARE i int DEFAULT 1;
a:WHILE i<=v_count DO
INSERT into test1 values (i);
SET i=i+1;
END WHILE;
END $
/*结束符置为;*/
DELIMITER ;
见效果:
mysql> CALL proc3(5);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * from test1;
+---+| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+---+
5 rows in set (0.00 sec)
示例2:添加leave控制语句
根据传⼊的参数v_count向test1表插⼊指定数量的数据,当插⼊超过10条,结
束。
/*删除存储过程*/
DROP PROCEDURE IF EXISTS proc4;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程*/
CREATE PROCEDURE proc4(v_count int)
BEGIN
DECLARE i int DEFAULT 1;
a:WHILE i<=v_count DO
INSERT into test1 values (i);
/*判断i=10,离开循环a*/
IF i=10 THEN
LEAVE a;
END IF;
SET i=i+1;
END WHILE;
END $
/*结束符置为;*/
DELIMITER ;
见效果:
mysql> DELETE FROM test1;
Query OK, 20 rows affected (0.00 sec)mysql> CALL proc4(20);
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * from test1;
+----+
| a |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+----+
10 rows in set (0.00 sec)
示例3:添加iterate控制语句
根据传⼊的参数v_count向test1表插⼊指定数量的数据,只插⼊偶数数据。
/*删除test1表记录*/
DELETE FROM test1;
/*删除存储过程*/
DROP PROCEDURE IF EXISTS proc5;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程*/
CREATE PROCEDURE proc5(v_count int)
BEGIN
DECLARE i int DEFAULT 0;
a:WHILE i<=v_count DO
SET i=i+1;
/*如果i不为偶数,跳过本次循环*/
IF i%2!=0 THEN
ITERATE a;
END IF; /*插⼊数据*/
INSERT into test1 values (i);
END WHILE;
END $
/*结束符置为;*/
DELIMITER ;
见效果:
mysql> DELETE FROM test1;
Query OK, 5 rows affected (0.00 sec)
mysql> CALL proc5(10);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * from test1;
+----+
| a |
+----+
| 2 |
| 4 |
| 6 |
| 8 |
| 10 |
+----+
5 rows in set (0.00 sec)
示例4:嵌套循环
test2表有2个字段(a,b),写⼀个存储过程(2个参数:vacount,vbcount),使
⽤双重循环插⼊数据,数据条件:a的范围[1,vacount]、b的范围[1,vbcount]所有
偶数的组合。
/*删除存储过程*/
DROP PROCEDURE IF EXISTS proc8;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程*/
CREATE PROCEDURE proc8(v_a_count int,v_b_count int)
BEGIN DECLARE v_a int DEFAULT 0;
DECLARE v_b int DEFAULT 0;
a:WHILE v_a<=v_a_count DO
SET v_a=v_a+1;
SET v_b=0;
b:WHILE v_b<=v_b_count DO
SET v_b=v_b+1;
IF v_a%2!=0 THEN
ITERATE a;
END IF;
IF v_b%2!=0 THEN
ITERATE b;
END IF;
INSERT INTO test2 VALUES (v_a,v_b);
END WHILE b;
END WHILE a;
END $
/*结束符置为;*/
DELIMITER ;
代码中故意将ITERATE a;放在内层循环中,主要让⼤家看⼀下效果。
见效果:
mysql> DELETE FROM test2;
Query OK, 6 rows affected (0.00 sec)
mysql> CALL proc8(4,6);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * from test2;
+---+---+
| a | b |+---+---+
| 2 | 2 |
| 2 | 4 |
| 2 | 6 |
| 4 | 2 |
| 4 | 4 |
| 4 | 6 |
+---+---+
6 rows in set (0.00 sec)