1. 程式人生 > >MySQL 流程控制

MySQL 流程控制

例子 區別 label condition 增加 -- 必須 if 語句 實現

1、MySQL 流程控制語句

  • MySQL 中可以使用 if、case、loop、leave、iterate、repeat 及 while 語句進行流程的控制。

1.1 if 語句

  • if 實現條件判斷,滿足不同的條件執行不同的語句列表。

    # if 語句
    
    # IF 
        search_condition 
      THEN 
        statement_list
      [ELSEIF search_condition THEN statement_list] ...
      [ELSE statement_list]
      END IF
    
    > if 
        i_staff_id = 2 
      then
        set @x1 = @x1 + d_amount;
      else
        set @x2 = @x2 + d_amount;
      end if;

1.2 case 語句

  • case 實現比 if 更復雜一些的條件構造。

    # case 語句
    
    # CASE
      WHEN 
        search_condition 
      THEN 
        statement_list
      [WHEN search_condition THEN statement_list] ...
      [ELSE statement_list]
      END CASE
    
    # CASE 
        case_value
      WHEN 
        when_value 
      THEN 
        statement_list
      [WHEN when_value THEN statement_list] ...
      [ELSE statement_list]
      END CASE
    
    > case
      when 
        i_staff_id = 2 
      then
        set @x1 = @x1 + d_amount;
      else
        set @x2 = @x2 + d_amount;
      end case;
    
    > case 
        i_staff_id
      when 
        2 
      then
        set @x1 = @x1 + d_amount;
      else
        set @x2 = @x2 + d_amount;
      end case;

1.3 loop 語句

  • loop 實現簡單的循環,退出循環的條件需要使用其他的語句定義,通常可以使用 leave 語句實現。

    # loop 語句
    
    # [begin_label:] LOOP
        statement_list
      END LOOP [end_label]
  • 如果不在 statement_list 中增加退出循環的語句,那麽 loop 語句可以用來實現簡單的死循環。

1.4 leave 語句

  • leave 用來從標註的流程構造中退出,通常和 BEGIN ... END 或者循環一起使用。

  • 下面是一個使用 loop 和 leave 的簡單例子,循環 100 次向 actor 表中插入記錄,當插入 100 條記錄後,退出循環。

    # leave 語句
    
    > create procedure actor_insert ()
      BEGIN
        set @x = 0;
      ins: LOOP
        set @x = @x + 1;
      IF 
        @x = 100 
      THEN
        LEAVE ins;
      END IF;
      INSERT INTO actor (first_name, last_name) VALUES ('Test', '201');
      END LOOP ins;
      END;
      $$
    
        Query OK, 0 rows affected (0.00 sec)
    
    > call actor_insert();
    
        Query OK, 0 rows affected (0.01 sec)
    
    > select count(*) from actor where first_name = 'Test';
    
        +----------+
        | count(*) |
        +----------+
        |      100 |
        +----------+
        1 row in set (0.00 sec)

1.5 iterate 語句

  • iterate 必須用在循環中,作用是跳過當前循環的剩下的語句,直接進入下一輪循環。

  • 下面的例子使用了 iterate 語句,當 @x 變量是偶數的時候,不再執行循環中剩下的語句,而直接進行下一輪的循環。

    # iterate 語句
    
    > CREATE PROCEDURE actor_insert ()
      BEGIN
        set @x = 0;
      ins: LOOP
        set @x = @x + 1;
      IF 
        @x = 10 
      THEN
        LEAVE ins;
      ELSEIF 
        mod(@x,2) = 0 
      THEN
        ITERATE ins;
      END IF;
      INSERT INTO actor(actor_id,first_name,last_name) VALUES (@x+200, 'Test',@x);
      END LOOP ins;
      END;
      $$
    
        Query OK, 0 rows affected (0.00 sec)
    
    > call actor_insert();
    
        Query OK, 0 rows affected (0.00 sec)
    
    > select actor_id,first_name,last_name from actor where first_name='Test';
    
        +----------+------------+-----------+
        | actor_id | first_name | last_name |
        +----------+------------+-----------+
        |      201 |       Test |         1 |
        |      203 |       Test |         3 |
        |      205 |       Test |         5 |
        |      207 |       Test |         7 |
        |      209 |       Test |         9 |
        +----------+------------+-----------+
        5 rows in set (0.00 sec)

1.6 repeat 語句

  • repeat 有條件的循環控制語句,當滿足條件的時候退出循環。

    # repeat 語句
    
    # [begin_label:] REPEAT
        statement_list
      UNTIL 
        search_condition
      END REPEAT [end_label]
    
    > REPEAT
      FETCH cur_payment INTO i_staff_id, d_amount;
      if 
        i_staff_id = 2 
      then
        set @x1 = @x1 + d_amount;
      else
        set @x2 = @x2 + d_amount;
      end if;
      UNTIL 
        0 
      END REPEAT;

1.7 while 語句

  • while 實現的也是有條件的循環控制語句,即當滿足條件時執行循環的內容。

  • while 循環和 repeat 循環的區別

    • while 是滿足條件才執行循環,repeat 是滿足條件退出循環;
    • while 在首次循環執行之前就判斷條件,所以循環最少執行 0 次,而 repeat 是在首次執行循環之後才判斷條件,所以循環最少執行 1 次。
    # while 語句
    
    # [begin_label:] WHILE search_condition DO
      statement_list
      END WHILE [end_label]
    
    > delimiter $$
    > CREATE PROCEDURE loop_demo ()
      BEGIN
        set @x = 1 , @x1 = 1;
      REPEAT
        set @x = @x + 1;
      UNTIL 
        @x > 0 
      END REPEAT;
    
      WHILE 
        @x1 < 0 
      DO
        set @x1 = @x1 + 1;
      END WHILE;
      END;
      $$
    
        Query OK, 0 rows affected (0.00 sec)
    
      > delimiter ;
      > call loop_demo();
    
        Query OK, 0 rows affected (0.00 sec)
    
      > select @x,@x1;
    
        +------+------+
        | @x   | @x1  |
        +------+------+
        |    2 |    1 |
        +------+------+
        1 row in set (0.00 sec)

MySQL 流程控制