MySQL 流程控制的回圈

2013-05-02_115713

这是MySQL 5实力养成暨评量里的8-24.‘下列何者为预储程序中流程控制可用的回圈式?’

答案:(C)WHILE … END WHILE (D)LOOP … END LOOP

[adsense][/adsense]

这题倒是让ㄚ琪NC了不少,明明就说是回圈式了,干嘛 还多选了一个CASE … END CASE这种判断式呢?就算无法全知所有的回圈式,也是可以答这题的,不过现在我们需要举一反三了,到底预储程序中可以用哪些回圈?

  1. REPEAT
  2. WHILE
  3. LOOP, LEAVE & ITERATE

就是上面这三种,在MySQL 5.7 Reference Manual :: 13 SQL Statement Syntax :: 13.6 MySQL Compound-Statement Syntax :: 13.6.5 Flow Control Statements,朋友们可以参考。

简体中文手册可以参考MySQL 5.1参考手册 :: 20.存储程序和函数::20.2. 存储程序的语法::20.2.12. 流程控制构造

转译成繁体如下:

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

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

目前还不支持FOR回圈。

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
以上, 我们以语法及实例介绍了流程控制的所有状况在资料库的应用中,是很重要的一个环节,一定要搞懂它,认证才能必胜