mysql自学笔记(二十六)之循环语句在存储过程中的应用

发布时间:2018-12-14 21:52:26 阅读:2350

    昨天看了下存储过程的基本使用

    看资料的时候,发现mysql的流程控制语句不止有 IF ELSE

    还有WHILE 、LOOP 等循环体。

    今天结合存储过程一起看下这部分

     

    if-then -else语句

    mysql> create procedure `TENNIS`.`largest`(out t char(10))
        -> begin
        ->   if (select count(*) from PLAYERS)>(select count(*) from PENALTIES)
        ->   then
        ->     set t='PLAYERS';
        ->    elseif (select count(*) from PLAYERS)=(select count(*) from PENALTIES)
        ->    then
        ->     set t='equal';
        ->    else
        ->     set t='PENALTIES';
        ->    end if;
        -> end $$
    mysql> delimiter ;
    mysql> call largest(@lgt);
    mysql> select @lgt;
    +---------+
    | @lgt    |
    +---------+
    | PLAYERS |
    +---------+

     

    case语句: 

    mysql> DELIMITER $$
    mysql> CREATE PROCEDURE p1()
        -> BEGIN
        ->   DECLARE v INT DEFAULT 3;
        ->   CASE v
        ->       WHEN 2 THEN SELECT v;
        ->       WHEN 3 THEN SELECT 0;
        ->       ELSE
        ->         BEGIN
        ->         END
        ->   END CASE;
        -> END $$
    mysql> DELIMITER ;
    mysql> call p1();
    +---+
    | 0 |
    +---+
    | 0 |
    +---+

     

    searched case:检索型case语句

    对于每个when子句,判断后面的布尔表达式search_condition是否为true:

      ①如果某个when子句的条件为true,则执行相应的then子句后面的语句statement_list;

      ②如果所有的when子句的条件都不为true,则执行else后面的语句statement_list。

    mysql> DELIMITER $$
    mysql> CREATE  PROCEDURE p2(
        ->      IN p1 INTEGER,
        ->      IN p2 INTEGER,
        ->      OUT p3 INTEGER) 
        -> BEGIN
        ->      CASE  
        ->          WHEN p1>p2 THEN SET p3=1;
        ->          WHEN p1=p2 THEN SET p3=2;
        ->          ELSE SET p3 = 3;
        ->      END CASE;      
        -> END$$
    mysql> DELIMITER ;
    mysql> call p2(123,321,@ax);
    mysql> select @ax;
    +------+
    | @ax  |
    +------+
    |    3 |
    +------+

     

    while ···· end while:

     先判断,后执行

    mysql> DELIMITER $$
    mysql> CREATE PROCEDURE do_while(x int)
        -> BEGIN
        ->   DECLARE v INT DEFAULT 5;
        ->   set v=x;
        ->   WHILE v>0 DO
        ->     select v;
        ->     SET v=v-1;
        ->   END WHILE;
        -> END$$
    mysql> DELIMITER ;
    mysql> call do_while(2);
    +------+
    |  v   |
    +------+
    |    2 |
    +------+
     
    +------+
    |  v   |
    +------+
    |    1 |
    +------+


    repeat···· end repeat:

     先执行,后判断

    mysql> DELIMITER $$
    mysql> CREATE  PROCEDURE dorepeat(p1 INT)
        -> BEGIN
        ->   SET @x=0;
        ->   REPEAT
        ->     SET @x = @x + 1;
        ->   UNTIL @x > p1 END REPEAT;     
        -> END$$
    mysql> DELIMITER ;
    mysql> CALL dorepeat(1000);
    mysql> SELECT @x;
    +------+
    | @x   |
    +------+
    | 1001 |
    +------+

     

    loop ·····end loop:

    创建过程,等待指定的秒数后结束

    mysql> delimiter $$
    mysql> create procedure wait_s(in wait_seconds int)
        -> begin
        ->   declare end_time datetime default now() + interval wait_seconds second;  #interval是间隔类型关键字
        ->   wait_loop:loop
        ->     if now() > end_time
        ->     then
        ->       leave wait_loop;  #leave语句表离开
        ->     end if;
        ->   end loop wait_loop;
        -> end $$
    mysql> delimiter ;
    mysql> call wait_x(10);
    ……等10秒,结束……

     

    LEAVE语句

    创建过程,其中的一个语句块较早的结束

    mysql> DELIMITER $$
    mysql> CREATE  PROCEDURE small_exit(OUT p1 INTEGER,OUT p2 INTEGER)
        -> BEGIN
        ->   SET p1 = 1;
        ->   SET p2 = 1;
        ->   block1:BEGIN
        ->     LEAVE block1;    #离开块block1
        ->     SET p2 = 3;    #已离开,不执行
        ->   END block1;
        ->   SET p1 = 4;    #执行
        -> END$$
    mysql> DELIMITER ;
    mysql> call small_exit(@r1,@r2);
    mysql> select @r1,@r2;
    +------+------+
    | @r1  | @r2  |
    +------+------+
    |    4 |    1 |
    +------+------+


    ITERATE

    只能出现在循环LOOP、REPEAT和WHILE 中(有标签)

    含义:跳出本次循环,开始一次新的循环

    mysql> delimiter $$
    mysql> CREATE PROCEDURE do_iterate(p1 INT)
        -> BEGIN
        ->   label_1: LOOP
        ->     SET p1 = p1 + 1;
        ->     IF p1 < 10 THEN ITERATE label_1;    #开始下一次循环
        ->     END IF;
        ->     LEAVE label_1;
        ->   END LOOP label_1;
        ->   SET @x = p1;
        -> END$$
    mysql> delimiter ;
    mysql> call do_iterate(1);
    mysql> select @x;
    +------+
    | @x   |
    +------+
    |   10 |
    +------+

     

    有好的建议,请在下方输入你的评论。


关键字mariadb mysql