MySQL 存储过程流程控制

分支语句

注:未经过本文作者同意,严禁转载

在 MySQL 中有两种类型的分支语句:

  • if-then-else
  • case
-- 单分支 if-then
DELIMITER $$
CREATE PROCEDURE procedure_test7(IN num INT)
BEGIN
  -- 如果 num 等于 1 则进入执行对应的 SQL 语句
  -- 如果不满足 则不进入,也就是不执行 SQL 语句
  IF num=1 THEN
    -- SQL执行
  END IF;
END $$

-- 双分支 if-then-else
DELIMITER $$
CREATE PROCEDURE procedure_test7(IN num INT)
BEGIN
  -- 如果满足 num 等于 1 则进入执行对应的 SQL1 语句,否则执行 SQL2 语句
  IF num=1 THEN
    -- SQL 1 执行
  ELSE
    -- SQL 2 执行
  END IF;
END $$

-- case
DELIMITER $$
CREATE PROCEDURE procedure_test9(IN num INT)
BEGIN
  CASE num 
  WHEN 1 THEN
    -- SQL 1 如果 num 的值为 1,则执行 SQL 1
  WHEN 2 THEN
    -- SQL 2 如果 num 的值为 2,则执行 SQL 2
  ELSE
    -- 如果 num 的值都不匹配,则执行 SQL
    -- SQL(如果变量的值和所有 when 的值都不匹配,则执行 else 中的 SQL)
    -- else 可以省略不写,你写了,就需要在里面加入对应的 SQL 语句
  END CASE;
END $$

例子1 单分支演示:

/*
创建一个存储过程:
如果参数输入的是 1 则添加一条员工信息
如果参数输入的不是 1 则不添加员工信息
*/
DELIMITER $$
CREATE PROCEDURE procedure_test7(IN num INT)
BEGIN
  -- 如果 num 等于 1 则进入执行对应的 SQL 语句
  -- 如果不满足 则不进入,也就是不执行 SQL 语句
  IF num=1 THEN
    INSERT INTO employees(`name`,`call`)
    VALUES('王五','123123');
  END IF;
END $$

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXsS0fk0-1640333397400)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224105206058.png)]

先来看一下表里的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2EUkvZFH-1640333397401)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224105340877-16403144219231.png)]

调用一下存储过程

CALL procedure_test7(1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQTJwDy9-1640333397401)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224105420241.png)]

好,没问题;再来看一下数据有没有添加进去
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-40X83LlX-1640333397402)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224105504954.png)]

例子2 双分支演示:

/*
创建一个存储过程:
如果参数输入的是 1 则添加一条员工信息,否则添加一条用户信息
*/
DELIMITER $$
CREATE PROCEDURE procedure_test8(IN num INT)
BEGIN
  -- 如果满足 num 等于 1 则进入执行对应的 SQL1 语句,否则执行 SQL2 语句
  IF num=1 THEN
    -- SQL 1 执行
    INSERT INTO employees(`name`,`call`)
    VALUES('赵六','234321');
  ELSE
    -- SQL 2 执行
    INSERT INTO users(`name`,`pwd`)
    VALUES('用户2','123');
  END IF;
END $$

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-am4vouT5-1640333397402)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224111620614.png)]

创建没问题,接下来,看一下 users 表和 employees 表的数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dNo0IfEb-1640333397404)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224111653259.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fy4UxVnF-1640333397405)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224111713731.png)]

调用存储过程,测试一下

CALL procedure_test8(3)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1DJgQuN-1640333397406)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224111730531.png)]

再看一下是否在 users 表中插入了数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2vA8fCU-1640333397406)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224111822020.png)]

例子3 case 分支演示:

*
创建一个存储过程:
参数输入的是 1 则添加一条员工信息
参数输入的是 2 则添加一条用户信息
*/
DELIMITER $$
CREATE PROCEDURE procedure_test9(IN num INT)
BEGIN
  CASE num 
  WHEN 1 THEN
    -- SQL 1 
    INSERT INTO employees(`name`,`call`)
    VALUES('阿七','3306123');
  WHEN 2 THEN
    -- SQL 2
    INSERT INTO users(`name`,`pwd`)
    VALUES('用户3','123');
  ELSE
    -- SQL(如果变量的值和所有 when 的值都不匹配,则执行 else 中的 SQL)
    -- else 可以不写
    UPDATE users SET pwd='321' WHERE `name`='用户2';
  END CASE;
END $$

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6TJAZZId-1640333397407)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224113633346.png)]

也是没问题的,现在我把 else 加上,由于刚才创建存储过程成功,现在删除一下重新创建

DROP PROCEDURE procedure_test9

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gzKO0UUC-1640333397408)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224114018882.png)]

来测试一下

CALL procedure_test9(3)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mpiYbUmj-1640333397409)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224114146723.png)]

好,没问题,来看一下,users 表是不是有被修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sIFujuGQ-1640333397409)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224114249063.png)]

循环语句

在 MySQL 中有三种循环语句

  • while
  • repeat
  • loop
-- while 写法1
DELIMITER $$
CREATE PROCEDURE procedure_test10(IN num INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  WHILE i<=num DO
    -- 编写需要重复执行的 SQL
    
    SET i=i+1;
  END WHILE;
END $$

-- while 写法2
DELIMITER $$
CREATE PROCEDURE procedure_test10(IN num INT)
BEGIN
  DECLARE i INT;
  SET i=0;
  WHILE i<=num DO
    -- 编写需要重复执行的 SQL
    
    SET i=i+1;
  END WHILE;

END $$

-- repeat
DELIMITER $$
CREATE PROCEDURE procedure_test11(IN num INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  REPEAT
     -- 编写需要重复执行的 SQL
    SET i=i+1; 
  UNTIL i>=num END REPEAT;
END $$

-- loop
DELIMITER $$
CREATE PROCEDURE procedure_test12(IN num INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  myloop:LOOP
    -- 编写需要重复执行的 SQL
    
    SET i=i+1;
    -- 如果 i 的值等于 num,进入执行
    IF i=num THEN
      -- leave 离开,离开谁,离开myloop
      LEAVE myloop;
    END IF;
  END LOOP;

END $$

例子1 while 循环演示:

-- 创建一个存储过程:使用 while 循环对 users 表进行数据插入
DELIMITER $$
CREATE PROCEDURE procedure_test10(IN num INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  WHILE i<=num DO
    -- 编写需要重复执行的 SQL
    -- CONCAT()函数作用是用来拼接的
    -- RAND()随机数函数
    INSERT INTO users(`name`,`pwd`)
    VALUES(CONCAT('用户',i),CONCAT(RAND()*(RAND(999-100)+100)));
    SET i=i+1;
  END WHILE;

END $$

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jCH6yL8g-1640333397410)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224120855450.png)]

创建没有问题,接下来,调用存储过程看一下是否可以重复插入数据

CALL procedure_test10(5)
SELECT `name`,`pwd` FROM users

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b72gH4Br-1640333397411)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224121023997.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gipWKTsc-1640333397412)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224121106957.png)]

例子2 repeat 循环演示:

-- 创建一个存储过程:使用 repeat 循环对 users 表进行数据插入
DELIMITER $$
CREATE PROCEDURE procedure_test11(IN num INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  REPEAT
  
    INSERT INTO users(`name`,`pwd`)
    VALUES(CONCAT('repeat用户',i),CONCAT(RAND()*(RAND(999-100)+100)));
    
    SET i=i+1; 
  UNTIL i>=num END REPEAT;
END $$

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cflgt2Nx-1640333397412)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224154524267.png)]

创建,没问题,接下来调用一下存储过程测试一下数据是否有添加成功

CALL procedure_test11(3)
SELECT `name`,`pwd` FROM users

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hD5N25kr-1640333397412)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224154831157.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aArLA99d-1640333397414)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224154913028.png)]

例子3 loop 循环演示:

-- 创建一个存储过程:使用 loop 循环对 users 表进行数据插入
DELIMITER $$
CREATE PROCEDURE procedure_test12(IN num INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  myloop:LOOP
    -- SQL
    INSERT INTO users(`name`,`pwd`)
    VALUES(CONCAT('loop用户',i),CONCAT(RAND()*(RAND(999-100)+100)));
    
    SET i=i+1;
    IF i=num THEN
      LEAVE myloop;
    END IF;
  END LOOP;

END $$

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CK0QPnvi-1640333397414)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224160418346.png)]

创建,没问题,接下来调用测试一下

CALL procedure_test12(3)
SELECT `name`,`pwd` FROM users

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kao6Y4Hv-1640333397415)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224160531335.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQmY6bau-1640333397416)(MySQL%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.assets/image-20211224160601064.png)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值