添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

循环是一段在程序中只出现一次,但可能会连续运行多次的代码。


循环中的代码会运行特定的次数,或者是运行到特定条件成立时结束循环。


image.png


循环分类:


while


repeat


loop


循环控制:


leave 类似于 break,跳出,结束当前所在的循环


iterate类似于 continue,继续,结束本次循环,继续下一次


while循环

【标签:】while 循环条件 do
end while【 标签】;
-- 创建测试表
create table user (
    uid int primary_key,
    username varchar ( 50 ),
    password varchar ( 50 )
-- -------存储过程-while
delimiter $$
create procedure proc16_while1(in insertcount int)
begin
    declare i int default 1;
    label:while i<=insertcount do
        insert into user(uid,username,`password`) values(i,concat('user-',i),'123456');
        set i=i+1;
    end while label;
end $$
delimiter ;
call proc16_while(10);
存储过程语法是固定的:delimiter
createpeocedure循环名(参数)begin代码end
createpeocedure循环名(参数)begin代码end
delimiter;



注意在写循环体的时候,必须要要有定义循环的初识变量,采用declare i int default 默认值


然后就是dlabel:while 判断条件 do 循环体 end while label; end && 必须要有


-- -------存储过程-while + leave
truncate table user;
delimiter $$
create procedure proc16_while2(in insertcount int)
begin
    declare i int default 1;
    label:while i<=insertcount do
        insert into user(uid,username,`password`) values(i,concat('user-',i),'123456');
        if i=5 then leave label;
        end if;
        set i=i+1;
    end while label;
end $$
delimiter ;
call proc16_while2(10);

如果在内部需要跳出循环的话,采用if 判断 ,但是最后需要end if 结尾


这里的leave就是 跳出循环,相对于break


-- -------存储过程-while+iterate
truncate table user;
delimiter $$
create procedure proc16_while3(in insertcount int)
begin
    declare i int default 1;
    label:while i<=insertcount do
        set i=i+1;
        if i=5 then iterate label;
        end if;
        insert into user(uid,username,`password`) values(i,concat('user-',i),'123456');





    
    end while label;
end $$
delimiter ;
call proc16_while3(10);

这里的iterate 相对于continue 遇到就不执行下面的代码


repeat循环

[标签:]repeat 
until 条件表达式
end repeat [标签];
-- -------存储过程-循环控制-repeat 
use mysql7_procedure;
truncate table user;
delimiter $$
create procedure proc18_repeat(in insertCount int)
begin
     declare i int default 1;
     label:repeat
         insert into user(uid, username, password) values(i,concat('user-',i),'123456');
         set i = i + 1;
         until  i  > insertCount
     end repeat label;

select '循环结束';

end $$

delimiter ;

call proc18_repeat(100);

这个相对于是,无论如何都会执行一次的循环,然后是在内部进行判断,如果满足了就直接跳出


loop循环

[标签:] loop
  if 条件表达式 then 
     leave [标签]; 
  end if;
end loop;
-- -------存储过程-循环控制-loop
truncate table user;
delimiter $$
create procedure proc19_loop(in insertCount int) 
begin
     declare i int default 1;
     label:loop
         insert into user(uid, username, password) values(i,concat('user-',i),'123456');
         set i = i + 1;
         if i > 5 
           leave label;
         end if;
     end loop label;
     select '循环结束';
end $$
delimiter ;
call proc19_loop(10);

这个和repeat不同的是,需要执行之后,利用leave 跳出循环,无论是使用哪种都可以达到我们需要的效果,但是在业务中的应用场景,while还是相对比较的多。



如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
MySQL基础教程13——函数——流程控制函数
如果value1为null则返回value2,不为null则返回value1,这里需要注意如果value1为""(空字符)不属于null返回空字符本身。