首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 條件判斷與流程控制:存儲函數與存儲過程實戰指南

     編輯:MySQL 資料庫相關知識

在 MySQL 5.0 版本之前,資料庫僅支援簡單的查詢語句,若要在 SQL 中實現 IF-ELSE、WHILE 等程式邏輯,必須借助存儲函數或存儲過程。本文透過三個完整實例,詳細示範如何在 MySQL 中編寫包含條件判斷與迴圈控制的存儲程式。

實例一:建立存儲函數實現 WHILE 迴圈

以下範例建立一個函數 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)

實例三:結合 IF 條件判斷與標籤迴圈

進階範例示範如何在 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),配合變數宣告、游標與錯誤處理,足以應對大多數業務邏輯封裝需求。實際開發中建議:

  1. 優先考慮應用層處理複雜邏輯,資料庫專注於資料存取
  2. 若必須在資料庫層實現,務必加上完整註釋與錯誤處理
  3. 避免在高併發核心路徑中使用耗時的存儲過程
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved