1.存储过程中循环的种类

在存储过程中可以进行循环逻辑,常用的循环有while、repeat、loop三种。

while循环是根据条件进行循环控制的,当条件满足后,才会执行循环中的SQL语句。

repeat循环是当条件满足后,就会退出循环。

loop循环是死循环,需要我们手动增加退出循环的条件,否则将一直处于死循环中。

2.WHILE循环控制

while循环是根据条件进行循环控制的,当条件满足后,才会执行循环中的SQL语句。

2.1.WHILE循环语法格式

WHILE 条件 DO
	SQL逻辑
END WHILEWHILE中的条件满足时,则进行循环,否则不进行循环。

2.2.WHILE循环经典案例

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。

第65讲:MySQL存储过程之循环语法的核心概念与应用案例-LMLPHP

3.REPEAT循环控制

REPEAT循环和WHILE循环正好相反,REPEAT循环是当条件满足时,则退出循环。

REPEAT循环会先进行一次逻辑,然后判断UNTIL中的条件是否满足,如果满足则退出循环,否则进行下一次循环。

特别注意UNTIL后面没有分号。

3.1.REPEAT循环语法结构

REPEAT
	SQL逻辑
	UNTIL 条件
END REPEAT

3.2.REPEAT循环经典案例

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);

第65讲:MySQL存储过程之循环语法的核心概念与应用案例-LMLPHP

4.LOOP循环控制

LOOP循环如果不指定退出循环的条件,那么可以实现简单的死循环。

如果我们不希望LOOP出现死循环,可以使用if条件结合LEAVE参数退出当前循环。

如果我们希望在LOOP循环根据条件跳过某一次循环,则可以使用ITERATE参数。

4.1.LOOP循环语法结构

循环名称:LOOP
	IF 条件 THEN
		LEAVE		#退出循环
	END IF
	
	IF 条件 THEN
		ITERATE 	#跳过本次循环
	END IF
	
	SQL逻辑
END LOOP 循环名称

4.2.LOOP循环经典案例一

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累加之后的结果。

第65讲:MySQL存储过程之循环语法的核心概念与应用案例-LMLPHP

4.3.LOOP循环经典案例二

本次案例难度有所提高,需要通过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。

第65讲:MySQL存储过程之循环语法的核心概念与应用案例-LMLPHP

2)调用存储过程

call proc_11(10);

传入整数10 ,从1到10取偶数累加,2+4+6+8+10,结果为30.

第65讲:MySQL存储过程之循环语法的核心概念与应用案例-LMLPHP

10-31 09:41