MySQL中存储过程中的控制语句使用详解

【1】if …then …elseif …then…else…end if

示例如下:

BEGIN
	#Routine body goes here...
  IF pinout = 0 THEN
	SELECT COUNT(*) FROM c_user  into pinout;
  ELSEIF pinout =1 THEN
    set pinout = 1;
  ELSE 
	set pinout =2;
  END IF;
END

MySQL中同样支持流程控制函数,如IF。

SELECT last_name,commission_pct,
IF(commission_pct IS NULL,'没奖金,呵呵','有奖金,嘻嘻') 备注
FROM employees;

完整存储过程实例如下:

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_user_count`(in sex_id INT,OUT user_count INT)
BEGIN
	#if ...else   
    IF sex_id = 0 THEN
    SELECT COUNT(*) FROM p_user WHERE p_user.sex="女" into user_count;
    ELSE
    SELECT COUNT(*) FROM p_user WHERE p_user.sex="男" INTO user_count;
    END IF;
END

【2】case …when …then…else…end case

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc2`(in param int)
begin
DECLARE s int ;
-- CASE ...WHEN  THEN...ELSE...END CASE
set s = param+1;
CASE s mod 2
	when 0 THEN
	select CONCAT(param,' is 奇数');
	ELSE
	select CONCAT(param,' is 偶数');
	
end CASE;
end

在select中应用


SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;

实例2


SELECT 
	(CASE day_week 
	WHEN  1 THEN '星期天' 
	WHEN  2 THEN '星期一'
	WHEN  3 THEN '星期二'
	WHEN  4 THEN '星期三'
	WHEN  5 THEN '星期四'
	WHEN  6 THEN '星期五'
	WHEN  7 THEN '星期六' 
	ELSE null END) as day_week,
 count(DISTINCT(if(gs.month_year=1,gs.order_num,null))) AS 'Janurary',
 count(DISTINCT(if(gs.month_year=2,gs.order_num,null))) AS 'February',
 count(DISTINCT(if(gs.month_year=3,gs.order_num,null))) AS 'March',
 count(DISTINCT(if(gs.month_year=4,gs.order_num,null))) AS 'April',
 count(DISTINCT(if(gs.month_year=5,gs.order_num,null))) AS 'May',
 count(DISTINCT(if(gs.month_year=6,gs.order_num,null))) AS 'June',
 count(DISTINCT(if(gs.month_year=7,gs.order_num,null))) AS 'July',
 count(DISTINCT(if(gs.month_year=8,gs.order_num,null))) AS 'August',
 count(DISTINCT(if(gs.month_year=9,gs.order_num,null))) AS 'September',
 count(DISTINCT(if(gs.month_year=10,gs.order_num,null))) AS 'October',
 count(DISTINCT(if(gs.month_year=11,gs.order_num,null))) AS 'November',
 count(DISTINCT(if(gs.month_year=12,gs.order_num,null))) AS 'December'

from goods_sale gs where gs.leaguer_code != 'null'  GROUP BY day_week;

【3】while ··do·· end while

如下在存储过程中应用while do:

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc3`()
begin 
declare var int; 
-- WHILE ...DO...END WHILE...
set var=0; 
while var<6 do 
insert into t_user(age) value(var); 
set var=var+1; 
end while; 
end

【4】repeat··until·· end repeat

相当于do …while;

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc4`()
begin  
-- repeat ...end repeat 
 declare v int; 
 set v=0; 
 repeat 
	 insert into t_user(age) values(v); 
	 set v=v+1; 
	 until v>=5 
 end repeat; 
 end

【5】loop ·····end loop

loop循环不需要初始条件,这点和while循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环,使用leave LOOP_LABLE终止。

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc6`()
begin 
 -- LOOP_LABLE:loop ....leave LOOP_LABLE.....end loop;
 declare v int; 
 set v=7; 
 LOOP_LABLE:loop 
	 insert into t_user(age) values(v); 
	 set v=v+1; 
	 if v >=20 then 
		leave LOOP_LABLE; 
	 end if; 
 end loop; 
end

需要说明的是LABLES标号:

标号可以用在begin,repeat,while或者loop语句前,语句标号只能在合法的语句前面使用。

可以跳出循环,使运行指令达到复合语句的最后一步。

标号用在begin前示例如下:

create procedure proc11(in v_num int,out o_result int)
zero_back:begin

	IF v_num <> 4 THEN	
			set o_result = -1;
			LEAVE zero_back; -- 跳出函数,不再向下执行
    END IF;
    insert into t_user(age) values(v_num);
    select count(*) into o_result from t_user;
end

leave 相当于break,跳出循环。根据标号位置不同,甚至可以跳出函数。


【6】ITERATE迭代

通过引用复合语句的标号,来重新开始复合语句;相当于continue。

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc5`()
begin 
-- LOOP_LABLE:loop...ITERATE LOOP_LABLE;...leave LOOP_LABLE;....end loop;
 declare v int; 
 set v=0; 

 LOOP_LABLE:loop 

 if v=3 then  
	 set v=v+1; 
	 
	 ITERATE LOOP_LABLE; -- 等于3时,v+1,进行下一次循环,不会插入数据
 end if; 

 insert into t_user(age) values(v); 
 set v=v+1; 
 if v>=5 then 
 leave LOOP_LABLE; 
 end if; 
 end loop; 
end

result as follows :

这里写图片描述

更多详细解释请参看:MySQL存储过程详解

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流烟默

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

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

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

打赏作者

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

抵扣说明:

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

余额充值