目录
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();