20.2.12. 流程控制构造

IF, CASE, LOOP, WHILE, ITERATE, 及 LEAVE 构造被完全实现。

这些构造可能每个包含要么一个单独语句,要么是使用BEGIN ... END复合语句的一块语句。构造可以被嵌套。

目前还不支持FOR循环。

20.2.12.1. IF语句

IF search_condition THEN statement_list
   
     
    [ELSEIF search_condition THEN statement_list] ...
   
     
    [ELSE statement_list]
   
     
END IF
   
     

IF实现了一个基本的条件构造。如果search_condition求值为真,相应的SQL语句列表被执行。如果没有search_condition匹配,在ELSE子句里的语句列表被执行。statement_list可以包括一个或多个语句。

请注意,也有一个IF() 函数,它不同于这里描述的IF语句。请参阅12.2节,“控制流程函数”

20.2.12.2. CASE语句

CASE case_value
   
     
    WHEN when_value THEN statement_list
   
     
    [WHEN when_value THEN statement_list] ...
   
     
    [ELSE statement_list]
   
     
END CASE
   
     

Or:

CASE
   
     
    WHEN search_condition THEN statement_list
   
     
    [WHEN search_condition THEN statement_list] ...
   
     
    [ELSE statement_list]
   
     
END CASE
   
     

存储程序的CASE语句实现一个复杂的条件构造。如果search_condition 求值为真,相应的SQL被执行。如果没有搜索条件匹配,在ELSE子句里的语句被执行。

注意:这里介绍的用在 存储程序里的CASE语句与12.2节,“控制流程函数”里描述的SQL CASE表达式的CASE语句有轻微不同。这里的CASE语句不能有ELSE NULL子句,并且用END CASE替代END来终止。

20.2.12.3. LOOP语句

[begin_label:] LOOP
   
     
    statement_list
   
     
END LOOP [end_label]
   
     

LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直循环被退出,退出通常伴随着一个LEAVE 语句。

LOOP语句可以被标注。除非begin_label存在,否则end_label不能被给出,并且如果两者都出现,它们必须是同样的。

20.2.12.4. LEAVE语句

LEAVE label
   
     

这个语句被用来退出任何被标注的流程控制构造。它和BEGIN ... END或循环一起被使用。

20.2.12.5. ITERATE语句

ITERATE label
   
     

ITERATE只可以出现在LOOP, REPEAT, 和WHILE语句内。ITERATE意思为:“再次循环。”

例如:

CREATE PROCEDURE doiterate(p1 INT)
   
     
BEGIN
   
     
  label1: LOOP
   
     
    SET p1 = p1 + 1;
   
     
    IF p1 < 10 THEN ITERATE label1; END IF;
   
     
    LEAVE label1;
   
     
  END LOOP label1;
   
     
  SET @x = p1;
   
     
END
   
     

20.2.12.6. REPEAT语句

[begin_label:] REPEAT
   
     
    statement_list
   
     
UNTIL search_condition
   
     
END REPEAT [end_label]
   
     

REPEAT语句内的语句或语句群被重复,直至search_condition 为真。

REPEAT 语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的。

例如

mysql> delimiter //
   
     

   
     
         
     
mysql> CREATE PROCEDURE dorepeat(p1 INT)
   
     
    -> BEGIN
   
     
    ->   SET @x = 0;
   
     
    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
   
     
    -> END
   
     
    -> //
   
     
Query OK, 0 rows affected (0.00 sec)
   
     

   
     
         
     
mysql> CALL dorepeat(1000)//
   
     
Query OK, 0 rows affected (0.00 sec)
   
     

   
     
         
     
mysql> SELECT @x//
   
     
+------+
   
     
| @x   |
   
     
+------+
   
     
| 1001 |
   
     
+------+
   
     
1 row in set (0.00 sec)
   
     

20.2.12.7. WHILE语句

[begin_label:] WHILE search_condition DO
   
     
    statement_list
   
     
END WHILE [end_label]
   
     

WHILE语句内的语句或语句群被重复,直至search_condition 为真。

WHILE语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的。

例如:

CREATE PROCEDURE dowhile()
   
     
BEGIN
   
     
  DECLARE v1 INT DEFAULT 5;
   
     

   
     
         
     
  WHILE v1 > 0 DO
   
     
    ...
   
     
    SET v1 = v1 - 1;
   
     
  END WHILE;
   
     
END
   
     
关注编程学问公众号