這是MySQL 5實力養成暨評量裡的8-24.『下列何者為預儲程序中流程控制可用的迴圈式?』
答案:(C)WHILE … END WHILE (D)LOOP … END LOOP
這題倒是讓ㄚ琪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 以上, 我們以語法及實例介紹了流程控制的所有狀況在資料庫的應用中,是很重要的一個環節,一定要搞懂它,認證才能必勝