MySQL 存儲過程循環

MySQL  存儲過程循環

MySQL循環語句(包括WHILEREPEATLOOP)來根據條件反覆運行代碼塊。mysql

MySQL提供循環語句,容許您根據條件重複執行一個SQL代碼塊。 MySQL中有三個循環語句:WHILEREPEATLOOPsql

咱們將在如下部分中更詳細地檢查每一個循環語句。express

WHILE循環

WHILE語句的語法以下:oop

WHILE expression DO
   statements
END WHILE

WHILE循環在每次迭代開始時檢查表達式。 若是expressionTRUE,MySQL將執行WHILEEND WHILE之間的語句,直到expressionFALSE。 WHILE循環稱爲預先測試條件循環,由於它老是在執行前檢查語句的表達式。測試

下面的流程圖說明了WHILE循環語句:spa

如下是在存儲過程當中使用WHILE循環語句的示例:code

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存儲過程當中:blog

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

要注意,若是不初始化x變量的值,那麼它默認值爲NULL。 所以,WHILE循環語句中的條件始終爲TRUE,而且您將有一個不肯定的循環,這是不可預料的。字符串

下面來測試test_mysql_while_loopstored調用存儲過程:it

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
相關文章
相關標籤/搜索