在存储过程中可以进行循环逻辑,常用的循环有while、repeat、loop三种。
while循环是根据条件进行循环控制的,当条件满足后,才会执行循环中的SQL语句。
repeat循环是当条件满足后,就会退出循环。
loop循环是死循环,需要我们手动增加退出循环的条件,否则将一直处于死循环中。
while循环是根据条件进行循环控制的,当条件满足后,才会执行循环中的SQL语句。
WHILE 条件 DO
SQL逻辑
END WHILE
当WHILE中的条件满足时,则进行循环,否则不进行循环。
计算从1累加到n的值,n可以作为存储结构的传参。
1)创建视图
思路:
1)首先定义一个局部变量total,用于记录每次累加后的结果。
2)然后进行WHILE循环,当n的值大于0的时候开始遍历循环,在循环中为total变量赋值,每次循环都为total的变量值+n,每次循环都对n的值减1,当n为0时,则退出循环,返回total的最终结果。
传入一个整数,每次循环都将这个整数与total变量值进行累加,每次循环后都要将n的值减1,并且将减之后的新n值带入下一次循环进行遍历,最终就能拿到累加的结果。
create procedure proc_8(in n int) #传入n的变量值
begin
declare total int default 0; #定义一个局部变量total,用于记录每次累加之后的结果,设置默认值为0
while n > 0 do #如果n的值大于0则开始循环
set total := total + n; #每次循环先进行一个运算,total的值+n的值运算之后为total变量的新值
set n := n - 1; #每次循环在对变量n的值进行修改,每次循环都将n的值减1,直到n的值为0退出循环
end while;
select total; #经过while循环之后total变量的值就是累加之后的结果
end;
2)调用视图
我们创建的视图proc_8,就可以计算从1到xxx的累加值,调用视图时传入要累加到多少的值即可,如下所示,要传入10,也就是计算从1到10的累加结果。
call proc_8(10);
1到10的累加结果为55。
REPEAT循环和WHILE循环正好相反,REPEAT循环是当条件满足时,则退出循环。
REPEAT循环会先进行一次逻辑,然后判断UNTIL中的条件是否满足,如果满足则退出循环,否则进行下一次循环。
特别注意UNTIL后面没有分号。
REPEAT
SQL逻辑
UNTIL 条件
END REPEAT
同样计算从1累加到n的值,n可以作为存储结构的传参。
1)创建存储过程
思路:
1)定义一个局部变量total,记录每次累加之后的新值。
2)然后每循环一次就将n的值与total的值累加,并对n的值减1,然后判断n是否小于等于0,如果小于等于0则退出循环。
create procedure proc_9(in n int)
begin
declare total int default 0;
repeat
set total := total + n;
set n := n - 1;
until n <= 0 #每次循环都为total变量的值加上n的值进行运算,同样也会为n的值减1,当n的值小于等于0时就表示全部累加完了,则会退出循环
end repeat;
select total;
end;
2)调用存储过程
call proc_9(10);
LOOP循环如果不指定退出循环的条件,那么可以实现简单的死循环。
如果我们不希望LOOP出现死循环,可以使用if条件结合LEAVE参数退出当前循环。
如果我们希望在LOOP循环根据条件跳过某一次循环,则可以使用ITERATE参数。
循环名称:LOOP
IF 条件 THEN
LEAVE #退出循环
END IF
IF 条件 THEN
ITERATE #跳过本次循环
END IF
SQL逻辑
END LOOP 循环名称
计算从1累加到n的值,n可以作为存储结构的传参。
LOOP循环不会指定条件,不像WHILE和REPEAT可以根据条件来退出循环,但是LOOP循环可以配合IF流程控制来判断某个条件,当条件满足时则退出循环。
1)编写存储过程
思路:
1)首先定义局部变量total记录累加之后的新结果。
2)然后定义LOOP循环,在循环中首先定义一个IF流程控制,判断n的值是否为0,如果为0,则使用LEAVE退出循环。
3)定义完条件判断之后,再去定义SQL逻辑:每循环一次total变量值等于当前total值加n值,并且n的值要减1。
create procedure proc_10(in n int)
begin
declare total int default 0;
leijia:loop #定义一个loop循环并为之起名为leijia
if n <= 0 then #首先定义一个条件判断,否则loop循环一直处于死循环,当n的值为0时
leave leijia; #通过leave参数退出循环
end if;
#条件判断准备好之后,有了退出循环的条件,开始定义SQL逻辑
set total := total + n; #total变量的新值每次循环都要用当前total的值+n的值
set n := n -1; #n变量的值每次循环都要减1
end loop leijia;
select total; #最后查询total新值
end;
2)调用存储过程
call proc_10(10)
调用proc_10函数,传入整数10,最后就可以拿到1到10累加之后的结果。
计算从1到n之间偶数累加的值,n为传入的参数。
本次案例难度有所提高,需要通过LOOP循环将传入的整数从1开始进行累加,还需要跳过奇数部分,只对偶数部分累加。
1)创建存储过程
思路:
1)首先定义局部变量total记录累加之后的新结果。
2)然后定义LOOP循环,在循环中首先定义一个IF流程控制,判断n的值是否为0,如果为0,则使用LEAVE退出循环。
3)然后再定义一个IF流程控制,主要用于判断当前n的变量值是否是奇数,如果是奇数则跳出本次循环,跳出本次循环的同时还要对n的值减1。
4)定义完条件判断之后,再去定义SQL逻辑:每循环一次total变量值等于当前total值加n值,并且n的值要减1。
如何判断n的变量值是否是奇数呢,其实也很简单,只要用n的变量值去除与2,并且取余数,如果余数为1,那么就表示该变量值为奇数,则退出循环。任何奇数除以2,余数都是1。
create procedure proc_11(in n int)
begin
declare total int default 0;
leijia:loop #定义一个loop循环并为之起名为leijia
if n <= 0 then #首先定义一个条件判断,否则loop循环一直处于死循环,当n的值为0时
leave leijia; #通过leave参数退出循环
end if;
if n%2 = 1 then #当n的变量值除以2,余数为1时,这个n的变量值一定为奇数
set n := n -1; #将n的变量值减1
iterate leijia; #然后跳出本次循环
end if;
#条件判断准备好之后,有了退出循环的条件,开始定义SQL逻辑
set total := total + n; #total变量的新值每次循环都要用当前total的值+n的值
set n := n -1; #n变量的值每次循环都要减1
end loop leijia;
select total; #最后查询total新值
end;
整体LOOP循环内,第一个IF是来定义是否退出循环的,每次循环n的变量值都会减1,当n的变量值为0,则退出循环,第二个IF是来判断n的变量值是否为奇数,任何奇数除以2都会余1,当余数为1就表示此次变量值是奇数,那么就将n的变量值减1,然后跳出本次循环,进入下一次循环,条件判断都准备好之后,就可以定义累加的逻辑了,每次循环为total变量赋值(原total值+n值)并且将n的值每次减1。
2)调用存储过程
call proc_11(10);
传入整数10 ,从1到10取偶数累加,2+4+6+8+10,结果为30.