一、循环结构
1、循环结构
程序在满足一定条件的基础上,重复执行一段代码。
循环结构只能放在 begin end 中!
2、分类
while、loop、repeat
3、循环控制
iterate:类似于 continue,继续,结束本次循环,继续下一次。
leave:类似于 break;跳出,结束当前所在的循环。
4、三种循环的对比
(1)这三种循环都可以省略名称,但如果循环中添加了循环控制语句(leave或iterate)则必须添加名称;
(2)loop 一般用于实现简单的死循环;
while 先判断后执行;
repeat 先执行后判断,无条件至少执行一次;
二、while 循环
1、语法格式
【标签:】while 循环条件 do
循环体;
end while【标签】;
三、loop 循环
1、语法结构
【标签:】loop
循环体;
end loop 【标签】;
可以用来模拟简单的死循环。
四、repeat 循环
1、语法结构
【标签:】repeat
循环体;
until 结束循环的条件
end repeat 【标签】;
五、案例
1、批量插入,根据次数插入到 admin 表中多条记录
没有添加循环控制语句:
1 DROP PROCEDURE pro_while1$
2 CREATE PROCEDURE pro_while1(IN insertCount INT)
3 BEGIN
4 DECLARE i INT DEFAULT 1;
5 WHILE i<=insertCount DO
6 INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
7 SET i=i+1;
8 END WHILE;
9
10 END $
11
12 CALL pro_while1(100)$
2、批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
使用标签和leave语句:
1 TRUNCATE TABLE admin$
2 DROP PROCEDURE test_while1$
3 CREATE PROCEDURE test_while1(IN insertCount INT)
4 BEGIN
5 DECLARE i INT DEFAULT 1;
6 a:WHILE i<=insertCount DO
7 INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
8 IF i>=20 THEN LEAVE a;
9 END IF;
10 SET i=i+1;
11 END WHILE a;
12 END $
13
14
15 CALL test_while1(100)$
3、批量插入,根据次数插入到admin表中多条记录,只插入偶数次
使用 iterate 语句和标签
1 TRUNCATE TABLE admin$
2 DROP PROCEDURE test_while1$
3 CREATE PROCEDURE test_while1(IN insertCount INT)
4 BEGIN
5 DECLARE i INT DEFAULT 0;
6 a:WHILE i<=insertCount DO
7 SET i=i+1;
8 IF MOD(i,2)!=0 THEN ITERATE a;
9 END IF;
10
11 INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
12
13 END WHILE a;
14 END $
15
16
17 CALL test_while1(100)$
4、流程控制综合案例
已知表stringcontent,其中字段:id 自增长,content varchar(20)。向该表插入指定个数的,随机的字符串:
(1)创建表:
1 DROP TABLE IF EXISTS stringcontent;
2
3 CREATE TABLE stringcontent(
4 id INT PRIMARY KEY AUTO_INCREMENT,
5 content VARCHAR(20)
6
7 );
(2)创建存储结构
1 DELIMITER $
2 CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
3 BEGIN
4 DECLARE i INT DEFAULT 1;
5 DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
6 DECLARE startIndex INT;#代表初始索引
7 DECLARE len INT;#代表截取的字符长度
8 WHILE i<=insertcount DO
9 SET startIndex=FLOOR(RAND()*26+1);#代表初始索引,随机范围1-26
10 SET len=FLOOR(RAND()*(20-startIndex+1)+1);#代表截取长度,随机范围1-(20-startIndex+1)
11 INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
12 SET i=i+1;
13 END WHILE;
14
15 END $
16
17 CALL test_randstr_insert(10)$