在存储过程和函数中,可以使用流程控制来控制语句的执行。
IF语句
IF语句用来进行条件判断。根据条件执行不同的语句。其语法的基本形式如下:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list]
...
[ELSE statement_list]
END IF
参数search_condition表示条件判断语句;参数statement_list表示不同条件的执行语句。
例如:可以通过IF语句判断一个人是否满18岁已经成年。
代码示例:
mysql> demiliter $ #改变结束符为'$'
mysql> create procedure proc_test_if(in age int,out op varchar(64)) #创建存储过程
-> begin
-> if age>=18 then set op='您已满18岁,已成年了'; #判断年龄
-> else set op='您未满18岁,是未成年';
-> end if;
-> end;
-> $
mysql> delimiter ; #改变结束符为';'
mysql> call proc_test_if(20,@op); #调用储存过程
mysql> select @op; #打印@op
上述语句,创建了一个存储过程名称为pro_test_if,参数一个传入的age类型为int,另一个参数是传出的op类型是varchar,下面就用到了判断age是否大于等于18岁来为op赋值,还有记得在写完存储后把结束符换回来,下面我们来调用。
上述语句为调用刚刚写好的存储过程并出入参数,显示输出的结果。
CASE 语句
CASE语句可以实现比IF语句更复杂的条件判断,其语法的基本形式如下:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]
...
[ELSE statement_list]
END CASE
其中,参数case_value表示条件判断的变量;参数when_value表示变量的取值;参数statement_list表示不同when_value值的执行语句。
代码示例:
mysql> delimiter $ #改变结束符为'$'
mysql> create procedure proc_tset_case(in level int,out attack int) #创建存储过程
-> begin
-> set attack=0; #初始化
-> case level #判断level
-> when 20 then set attack=attack+5;
-> when 30 then set attack=attack+10;
-> when 40 then set attack=attack+15;
-> else set attack=attack+1;
-> end case;
-> end;
-> $
mysql> delimiter ; #改变结束符为';'
mysql> call proc_tset_case(20,@attack); #调用存储过程
mysql> select @attack;
上述语句当级别level值为20时,attack值加5;当级别level值为30时,attack值加10;当级别level值为40时,attack值加15;否则,attack + 1。CASE语句使用END CASE结束。
LOOP语句
LOOP语句可以使某些特定的语句重复执行,实现一个简单的循环。LOOP语句本身没有停止循环,只有遇到LEAVE语句等才停止循环。LOOP语句的语法形式如下:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
其中,参数begin_label和参数end_label分别表示循环开始和结束的标志,这两个标志必须相同,而且都可以省略;参数statement_list表示需要循坏执行的语句。
LEVEL语句
LEAVE语句主要用于跳出循环控制,其语法形式如下:
LEAVE label
其中,参数label表示循环的标志。
例如:计算1加到100。
代码示例:
mysql> delimiter $ #改变结束符为'$'
mysql> create procedure pro_test_lv(in input int, out op int) #创建存储过程
-> begin
-> declare flag int;
-> set flag=0;
-> add_num:loop #循环的开始
-> set flag=flag+1;
-> set input=input+flag; #计算0+1+...+100
-> if flag=100 then leave add_num; #flag到100后结束循环
-> end if;
-> end loop add_num;
-> set op=input;
-> end;
-> $
mysql> delimiter ; #改变结束符为';'
mysql> call pro_test_lv(0,@op); #调用存储过程
mysql> select @op;
该循环flag从0加到100,当flag的值等于100时,leave语句跳出循环。让input从0+1+...+100结束后再把结果赋值给op。
ITERATE语句
ITERATE语句也是用来跳出循环的语句,但是ITERATE语句是跳出本次循环,然后直接进入下一次循环,ITERATE语句的语法形式如下:
ITERATE label
其中,参数label表示循环的标志。
例如:求0-10中偶数之和。
代码示例:
mysql> delimiter $ #改变结束符为'$'
mysql> create procedure pro_test_IT(in input int, out op int) #创建存储过程
-> begin
-> declare flag int;
-> set flag=0;
-> add_num:loop #循环的开始
-> set flag=flag+1;
-> if flag>10 then leave add_num; #当flag>10时结束循环
-> elseif mod(flag,2)=1 then iterate add_num; #当flag时奇数时跳过本次循环
-> else set input=input+flag; #计算0+2+4+...+10
-> end if;
-> end loop add_num;
-> set op=input;
-> end;
-> $
mysql> delimiter ; #改变结束符为';'
mysql> call pro_test_IT(0,@op); #调用存储空间
mysql> select @op;
该示例循环执行flag加1的操作,flag的值为大于10时结束循环。如果flag的值除2余1,就跳出本次循环,不再执行下面的select语句,如果都不满足就让input=input+falg来计算偶数的和,最终循环结束后再将input赋值给op。