image.png

循环结构


/
分类:
while、loop、repeat

循环控制:

iterate类似于 continue,(继续),结束本次循环,继续下一次
leave 类似于break,跳出,结束当前所在的循环


/



#1.while

/
语法:
【标签:】while 循环条件 do
循环体;
end while 【标签】;

/



#2.loop (环、循环)

/
语法:
【标签:】loop
循环体;
end loop 【标签】;

loop没有循环条件,可以用来模拟简单的死循环

/



#3.repeat

/
语法:
【标签:】repeat
循环体;
until 结束循环的条件
end repeat 【标签】;

/


#没有添加循环控制语句

案例:批量插入,根据次数插入到admin表中多条记录


DROP PROCEDURE pro_while
DELIMITER $
CREATE PROCEDURE pro_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,password) VALUE(CONCAT(‘Rose’,i),’666’);
SET i=i+1;
END WHILE;

END $

#调用
CALL pro_while(20)



#2.添加leave语句

#案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
DELIMITER $
CREATE PROCEDURE test_while2(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username,password)VALUE(CONCAT(‘小红’,i),’777’);
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $

CALL test_while2(45)


#3.添加iterate语句

#案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
DELIMITER $
CREATE PROCEDURE test_while3(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,password)VALUE(CONCAT(‘小黑’,i),’777’);

END WHILE a;
END $

CALL test_while3(30)

SELECT FROM admin


练习:
/

一、已知表stringcontent
其中字段:
id自增长
content varchar(20)

向该表插入指定个数的,随机的字符串

/

DROP TABLE IF EXISTS stringcontent;
#建表
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)


);
#构造存储过程
DELIMITER $
CREATE PROCEDURE test_reandstr_insert(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;#定义一个循环变量i,表示插入次数
DECLARE str VARCHAR(26) DEFAULT ‘qwertyuioplkjhgfdsazxcvbnm’;
DECLARE startIndex INT DEFAULT 1;#代表起始索引
DECLARE len INT DEFAULT 1;#代表截取的字符的长度
WHILE i<=insertCount DO


SET len=FLOOR(RAND()
(20-startIndex+1)+1);#产生一个随机的整数,代表截取的长度,1-(26-startIndex+1)
SET startIndex=FLOOR(RAND()*26+1);#产生一个随机的整数,代表起始索引1-26
INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
SET i=i+1;#循环变量更新
END WHILE;
END $


CALL test_reandstr_insert(10)