这是MySQL 5实力养成暨评量里的8-24.‘下列何者为预储程序中流程控制可用的回圈式?’
答案:(C)WHILE … END WHILE (D)LOOP … END LOOP
[adsense][/adsense]
这题倒是让ㄚ琪NC了不少,明明就说是回圈式了,干嘛 还多选了一个CASE … END CASE这种判断式呢?就算无法全知所有的回圈式,也是可以答这题的,不过现在我们需要举一反三了,到底预储程序中可以用哪些回圈?
- REPEAT
- WHILE
- 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可以包括一个或多个语句。
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来终止。
[ begin_label :] LOOP
statement_list
END LOOP [ end_label ]
LOOP 允许某特定语句或语句群的重复执行,实现一个简单的回圈构造。在回圈内的语句一直重复直到回圈被退出,退出通常伴随着一个LEAVE语句。
LOOP语句可以被标注。除非begin_label存在,否则end_label不能被给出,并且如果两者都出现,它们必须是同样的。
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
[ 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)
[ 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 以上, 我们以语法及实例介绍了流程控制的所有状况在资料库的应用中,是很重要的一个环节,一定要搞懂它,认证才能必胜
