MySQL存储过程中的流程控制

本文介绍了MySQL中用于流程控制的几种语句,包括IF...THEN...ELSE...ENDIF用于条件判断,CASE语句进行多条件选择,WHILE、LOOP和REPEAT实现循环结构。这些语句在创建存储过程时非常有用,能够实现复杂的逻辑控制。
摘要由CSDN通过智能技术生成

IF语句

语法
if condition then 第1判断
第1语句体
[else if condition then] 第2判断
第2语句体
[else if condition then] 第n判断
第n语句体
[else]
最后语句体
end if

IF语句为分支语句,首先进行第1判断,若成立,则执行第1语句体,执行完后跳到end if后面的语句继续执行;若不成立,则进行第2判断,若成立,则执行第2语句体,执行完后跳到end if后面的语句执行…

例:

use db_test		--选取数据库
DROP procedure IF EXISTS test_if;		--若过程test_if存在则删除
delimiter $		--定义分界符
CREATE procedure test_if(IN x INT)		--创建过程
begin
if x=1 then		--x为传入变量,若x=1则执行SELECT ‘OK’;
SELECT ‘OK’;
elseif x=0 then		--x为0则执行SELECT ‘’NO;
SELECT ‘NO’;
else
SELECT 'good';
end if;	--结束if
end;		--结束
$
delimiter ;

执行:

mysql> call test_if(0);
mysql> call test_if(1);
mysql> call test_if(2);

例:下面这个示例用于生成当天唯一流水号:

use db_test;		--选取数据库
DROP procedure IF EXISTS lsid3;		--若过程存在则删除
DELIMITER $$		--定界符
-- 存储过程:取得当天最大的流水
CREATE DEFINER=root@localhost PROCEDURE isid3(out lid VARCHAR(20))		--创建过程
BEGIN
-- 创建表
CREATE TABLE IF NOT EXISTS ykxt_lsh(
rq VARCHAR(8) NOT NULL,
lsh DECIMAL(10,0) NOT NULL,
PRIMARY KEY (rq)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SELECT CONVERT(DATE_FORMAT(sysdate(),'%y%m%d'),char) INTO @l_fwqsj_str;
SELECT COUNT(*) INTO @l_sss FROM ykxt_lsh;
if @l_sss=0 then
INSERT INTO ykxt_lsh(rq,lsh) values (@l_fwqsj_str,1);
else
	SELECT rq INTO @ll_xflsh_rq FROM ykxt_lsh;
	if @ll_xflsh_rq=@l_fwqsj_str then
		UPDATE ykxt_lsh SET lsh=lsh+1;
	else
		UPDATE ykxt_lsh SET rq=@l_fwqsj_str,lsh=1;
	end if;
end if;
SELECT rq,CONVERT(lsh,char) INTO @ll_xflsh_rq,@ll_opid_char FROM ykxt_lsh;
SELECT CONCAT(@ll_xflsh_rq,@ll_opid_char) INTO lid;
END;
 $$
 DELIMITER ;

执行:

mysql> SELECT @lid;

CASE语句

语法结构(一)
case value "CASE 被比较的值"
when value_1 then
第1个when语句体
[when value_2 then
第2个when语句体]
...
[when value_n then
第n个when语句体]
[else
else语句体]
end case
语法结构(二)
case
when condition_1 then 第1个when判断
	第1个语句体
[when condition_2 then 第2个when判断
	第2个语句体]
...
[when condition_n then 第n个when判断
	第n个语句体]
[else 
	else语句体]

例(结构一):

use db_test;
DROP procedure IF EXISTS test_case;
delimiter //
CREATE procedure test_case (IN x INT)
begin
case x
when 1 then SELECT 'OK';
when 0 then SELECT 'No';
else SELECT 'good';
end case;
end;
//
delimiter ;

执行:

mysql> call test_case(0);
mysql> call test_case(1);
mysql> call test_case(2);

例(结构二):

use db_test;
DROP procedure IF EXISTS test_case2;
delimiter //
CREATE procedure test_case 2(IN x INT)
begin
case 
when x=1 then SELECT 'OK';
when x=0 then SELECT 'No';
else SELECT 'good';
end case;
end;
//
delimiter ;

执行:

mysql> call test_case2(0);
mysql> call test_case2(1);
mysql> call test_case2(2);

WHILE 语句

语法结构
while condition do
...
end while

例:

use db_test;
DROP procedure IF EXISTS test_while;
delimiter //
CREATE procedure test_while(out sum INT)
begin
declare i INT default 1;
declare s INT default 0;
while i<=10 do
SET s=s+i;
SET i=i+1;
end while;
SET sum=s;
end;
//
delimiter ;

执行:

mysql> call test_while(@s);
mysql> SELECT @s;

LOOP语句

语法结构

loop
...
end loop

例:

use db_test;
DROP procedure IF EXISTS test_loop;
delimiter //
CREATE procedure test_loop(out sum INT)
begin
declare i INT default 1;
declare s INT default 0;
loop_label:loop
SET s=s+i;
SET i=i+1;
if i>10 then leave loop_label;
end if;
end loop;
SET sum=s;
end;
//
delimiter ;

执行:

mysql> call test_loop(@s);
mysql> SELECT @s;

REPEAT语句

语法结构
repeat
...
until condition
end repeat

例:

use db_test;
DROP procedure IF EXSIST test_repeat;
delimiter //
CREATE procedure test_repeat(out sum INT)
begin
declare i INT default 1;
declare s INT default 0;
repeat 
SET s=s+i;
SET i=i+1;
until i>10		--此处不能有分号
END repeat;
SET sum=s;
end;
//
delimiter ;

执行:

mysql> call test_repeat(@s);
mysql> SELECT @s;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

盛者无名

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

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

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

打赏作者

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

抵扣说明:

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

余额充值