MySQL儲存過程迴圈

2019-10-16 22:56:21

在本教學中,將學習如何使用各種MySQL迴圈語句(包括WHILEREPEATLOOP)來根據條件反復執行程式碼塊。

MySQL提供迴圈語句,允許您根據條件重複執行一個SQL程式碼塊。 MySQL中有三個迴圈語句:WHILEREPEATLOOP

我們將在以下部分中更詳細地檢查每個迴圈語句。

WHILE迴圈

WHILE語句的語法如下:

WHILE expression DO
   statements
END WHILE

WHILE迴圈在每次疊代開始時檢查表示式。 如果expressionevaluatesTRUE,MySQL將執行WHILEEND WHILE之間的語句,直到expressionevaluatesFALSEWHILE迴圈稱為預先測試條件迴圈,因為它總是在執行前檢查語句的表示式。

下面的流程圖說明了WHILE迴圈語句:

以下是在儲存過程中使用WHILE迴圈語句的範例:

DELIMITER $$
 DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
 CREATE PROCEDURE test_mysql_while_loop()
 BEGIN
 DECLARE x  INT;
 DECLARE str  VARCHAR(255);

 SET x = 1;
 SET str =  '';

 WHILE x  <= 5 DO
 SET  str = CONCAT(str,x,',');
 SET  x = x + 1; 
 END WHILE;

 SELECT str;
 END$$
DELIMITER ;

在上面的test_mysql_while_loop儲存過程中:

  • 首先,重複構建str字串,直到x變數的值大於5
  • 然後,使用SELECT語句顯示最終的字串。

要注意,如果不初始化x變數的值,那麼它預設值為NULL。 因此,WHILE迴圈語句中的條件始終為TRUE,並且您將有一個不確定的迴圈,這是不可預料的。

下面來測試test_mysql_while_loopstored呼叫儲存過程:

CALL test_mysql_while_loop();

執行上面查詢語句,得到以下結果 -

mysql> CALL test_mysql_while_loop();
+------------+
| str        |
+------------+
| 1,2,3,4,5, |
+------------+
1 row in set

Query OK, 0 rows affected

REPEAT迴圈

REPEAT迴圈語句的語法如下:

REPEAT
 statements;
UNTIL expression
END REPEAT

首先,MySQL執行語句,然後評估求值表示式(expression)。如果表示式(expression)的計算結果為FALSE,則MySQL將重複執行該語句,直到該表示式計算結果為TRUE

因為REPEAT迴圈語句在執行語句後檢查表示式(expression),因此REPEAT迴圈語句也稱為測試後迴圈。

下面的流程圖說明了REPEAT迴圈語句的執行過程:

我們可以使用REPEAT迴圈語句重寫test_mysql_while_loop儲存過程,使用WHILE迴圈語句:

DELIMITER $$
 DROP PROCEDURE IF EXISTS mysql_test_repeat_loop$$
 CREATE PROCEDURE mysql_test_repeat_loop()
 BEGIN
 DECLARE x INT;
 DECLARE str VARCHAR(255);

 SET x = 1;
        SET str =  '';

 REPEAT
 SET  str = CONCAT(str,x,',');
 SET  x = x + 1; 
        UNTIL x  > 5
        END REPEAT;

        SELECT str;
 END$$
DELIMITER ;

要注意的是UNTIL表示式中沒有分號(;)。

執行上面查詢語句,得到以下結果 -

mysql> CALL mysql_test_repeat_loop();
+------------+
| str        |
+------------+
| 1,2,3,4,5, |
+------------+
1 row in set

Query OK, 0 rows affected

LOOP,LEAVE和ITERATE語句

有兩個語句允許您用於控制迴圈:

  • LEAVE語句用於立即退出迴圈,而無需等待檢查條件。LEAVE語句的工作原理就類似PHPC/C++Java等其他語言的break語句一樣。
  • ITERATE語句允許您跳過剩下的整個程式碼並開始新的疊代。ITERATE語句類似於PHPC/C++Java等中的continue語句。

MySQL還有一個LOOP語句,它可以反復執行一個程式碼塊,另外還有一個使用迴圈標籤的靈活性。

以下是使用LOOP迴圈語句的範例。

CREATE PROCEDURE test_mysql_loop()
 BEGIN
 DECLARE x  INT;
        DECLARE str  VARCHAR(255);

 SET x = 1;
        SET str =  '';

 loop_label:  LOOP
 IF  x > 10 THEN 
 LEAVE  loop_label;
 END  IF;

 SET  x = x + 1;
 IF (x mod 2) THEN
     ITERATE  loop_label;
 ELSE
    SET  str = CONCAT(str,x,',');
 END IF;
    END LOOP;    
    SELECT str;
END;
  • 以上儲存過程僅構造具有偶數位符串的字串,例如2,4,6等。
  • LOOP語句之前放置一個loop_label迴圈標籤。
  • 如果x的值大於10,則由於LEAVE語句,迴圈被終止。
  • 如果x的值是一個奇數,ITERATE語句忽略它下面的所有內容,並開始一個新的疊代。
  • 如果x的值是偶數,則ELSE語句中的塊將使用偶數構建字串。

執行上面查詢語句,得到以下結果 -

mysql> CALL test_mysql_loop();
+-------------+
| str         |
+-------------+
| 2,4,6,8,10, |
+-------------+
1 row in set

Query OK, 0 rows affected

在本教學中,您學習了基於條件重複執行程式碼塊的各種MySQL迴圈語句。