MySQL数据库-存储过程与函数-IF、CASE、LOOP、LEAVE和ITERATE语句详解

在存储过程和函数中,可以使用流程控制来控制语句的执行。

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长天一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值