MySql 存储过程的控制语句(条件语句、循环语句、游标循环)

MySQL 5.0 版本开始支持存储过程。存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

一、条件语句

1、 if-then-else 语句
DROP PROCEDURE matches; -- 不存在这个储存过程时不用运行
CREATE PROCEDURE matches()
BEGIN
	DECLARE a,b int DEFAULT 0; 
	-- if
	IF a = 0 THEN
		SELECT 'ture',a;
	END IF;
	-- if-else
	IF b != 0 THEN
		SELECT 'ture',b;
	ELSE 
		SELECT 'false',b;
	END IF;
END;

CALL matches();
2、case语句
DROP PROCEDURE matches; -- 不存在这个储存过程时不用运行
CREATE PROCEDURE matches()
BEGIN
	DECLARE a,b int DEFAULT 0; 
	-- CASE
	CASE a
	WHEN 0 THEN
		SELECT '0',a;
	WHEN 1 THEN
		SELECT '1',a;
	ELSE
		SELECT '--',a;
	END CASE;
END;

CALL matches();

二、循环语句

1、while ···· end while
DROP PROCEDURE matches; -- 不存在这个储存过程时不用运行
CREATE PROCEDURE matches()
BEGIN
	DECLARE a,b int DEFAULT 0; 
	-- while 
	while a<6 do
		SELECT a,b;
	  	set a=a+1;  
  	end while;  
END;
CALL matches();
2、repeat···· end repeat

它在执行操作后检查结果,而 while 则是执行前进行检查。
满足until 条件时退出

DROP PROCEDURE matches; -- 不存在这个储存过程时不用运行
CREATE PROCEDURE matches()
BEGIN
	DECLARE a,b int DEFAULT 0; 
	-- repeat
	 repeat  
		 SELECT a,b; 
		 set a=a+1;  
		 until a>=5 
   end repeat;
END;
CALL matches();
3. loop ·····endloop

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

DROP PROCEDURE matches; -- 不存在这个储存过程时不用运行
CREATE PROCEDURE matches()
BEGIN
	DECLARE a,b int DEFAULT 0; 
	-- repeat
	LOOP_LABLE:loop  
		SELECT a,b;
		set a=a+1;  
	if a >=5 then 
		-- 满足条件时结束循环
		leave LOOP_LABLE;  
  end if;  
  end loop;  
END;
CALL matches();
4.ITERATE迭代

通过ITERATE LOOP_LABLE; 跳出当前循环

DROP PROCEDURE matches; -- 不存在这个储存过程时不用运行
CREATE PROCEDURE matches()
BEGIN
	DECLARE a,b int DEFAULT 0; 
	-- repeat
	 LOOP_LABLE:loop  
		 if a=3 then   
			 set a=a+1;  
			 ITERATE LOOP_LABLE;  
		 end if;  
		 
		 SELECT a,b;
		 set a=a+1;  
		 if a>=5 then 
		   leave LOOP_LABLE;  
		 end if;  
   end loop; 
END;
CALL matches();
5.游标循环
DROP PROCEDURE matches; -- 不存在这个储存过程时不用运行
CREATE PROCEDURE matches()
BEGIN
	DECLARE done int DEFAULT 0; 
	DECLARE nameC VARCHAR(100) ; 
	#定义游标
	DECLARE idCur CURSOR FOR  SELECT * FROM (SELECT 1 as nameC UNION SELECT 2) a;
	#定义 设置循环结束标识done值怎么改变 的逻辑
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
	#打开游标
	OPEN idCur;
		-- 执行循环  
		FETCH idCur INTO nameC;
		WHILE  done <> 1 DO
			SELECT nameC; 
			#游标循环中 不能使用 SELECT a into a ... 赋值
			FETCH idCur INTO nameC; #  对nameC赋值 给下一个循环使用
		 END WHILE; 
		#关闭游标 
	CLOSE idCur;
END;
CALL matches();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值