在 MySQL 5.0 版本之前,資料庫僅支援簡單的查詢語句,若要在 SQL 中實現 IF-ELSE、WHILE 等程式邏輯,必須借助存儲函數或存儲過程。本文透過三個完整實例,詳細示範如何在 MySQL 中編寫包含條件判斷與迴圈控制的存儲程式。
以下範例建立一個函數 myFunction,接收整數參數 quantity,若該值不是 12 的倍數,則透過 WHILE 迴圈遞增直到成為 12 的倍數為止,最後回傳結果。
mysql> DELIMITER //
mysql> CREATE FUNCTION myFunction (quantity INT(10)) RETURNS INT(10)
-> BEGIN
-> WHILE quantity MOD 12 > 0 DO
-> SET quantity = quantity + 1;
-> END WHILE;
-> RETURN quantity;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> select myFunction(10);
+----------------+
| myFunction(10) |
+----------------+
| 12 |
+----------------+
1 row in set (0.00 sec)
mysql> select myFunction(24);
+----------------+
| myFunction(24) |
+----------------+
| 24 |
+----------------+
1 row in set (0.00 sec)
解析:輸入 10 時,迴圈執行兩次(10→11→12),回傳 12;輸入 24 已是 12 的倍數,迴圈不執行,直接回傳 24。
此範例建立存儲過程 test_while,接收輸入參數 in_count(雖然本例中未實際使用),宣告區域變數 count 並透過 WHILE 迴圈累加至 10,最後輸出結果。
mysql> delimiter //
mysql> create procedure test_while (IN in_count INT)
-> BEGIN
-> declare count INT default 0;
-> while count < 10 do
-> set count = count + 1;
-> end while;
-> select count;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call test_while(10);
+-------+
| count |
+-------+
| 10 |
+-------+
1 row in set (0.00 sec)
進階範例示範如何在 WHILE 迴圈中嵌套 IF 判斷,並使用迴圈標籤 loop1 控制流程。該過程列印 1 到 10 之間的所有奇數。
mysql> delimiter $$
mysql> CREATE PROCEDURE myProc()
-> BEGIN
-> DECLARE i int;
-> SET i=1;
-> loop1: WHILE i<=10 DO
-> IF MOD(i,2)<>0 THEN
-> SELECT CONCAT(i,' is an odd number');
-> END IF;
-> SET i=i+1;
-> END WHILE loop1;
-> END$$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call myProc();
+-------------------------------+
| CONCAT(i,' is an odd number') |
+-------------------------------+
| 1 is an odd number |
| 3 is an odd number |
| 5 is an odd number |
| 7 is an odd number |
| 9 is an odd number |
+-------------------------------+
關鍵點:
DELIMITER 變更語句分隔符,避免過程體內的分號被誤判為結束符MOD(i,2)<>0 判斷奇數(取餘不等於 0)loop1 可搭配 LEAVE、ITERATE 實現複雜流程控制MySQL 存儲程式提供了完整的流程控制能力(IF、CASE、WHILE、REPEAT、LOOP),配合變數宣告、游標與錯誤處理,足以應對大多數業務邏輯封裝需求。實際開發中建議: