MySQL 5.0 引入儲存程序,將業務邏輯封裝在資料庫層,能減少網路傳輸、提升效能並集中管理規則。本文從語法基礎到流程控制,配合完整範例,帶你快速上手。
CREATE PROCEDURE sp_name ([param_list])
BEGIN
-- SQL 陳述式區塊
END;
proc_、usp_)避免衝突CALL sp_name()| 模式 | 說明 | 範例 |
|---|---|---|
IN | 輸入參數(預設),呼叫端傳入 | IN p_id INT |
OUT | 輸出參數,程式內賦值供呼叫端接收 | OUT p_name VARCHAR(50) |
INOUT | 雙向參數,可傳入亦可傳出 | INOUT p_total DECIMAL(10,2) |
-- 呼叫
CALL proc_get_user(100, @out_name);
SELECT @out_name;
-- 刪除
DROP PROCEDURE IF EXISTS proc_get_user;
限制:無法在儲存程序內直接 DROP 另一個程序,只能 CALL。
-- 匿名區塊
BEGIN
SELECT 1;
END;
-- 帶標籤區塊(可搭配 LEAVE/ITERATE)
my_block: BEGIN
SELECT 2;
LEAVE my_block; -- 跳出此區塊
SELECT 3; -- 不會執行
END my_block;
IF condition THEN
-- statements
ELSEIF other_condition THEN
-- statements
ELSE
-- statements
END IF;
-- CASE 簡單形式
CASE expr
WHEN val1 THEN stmt1
WHEN val2 THEN stmt2
ELSE stmt_default
END CASE;
-- CASE 搜尋形式
CASE
WHEN condition1 THEN stmt1
WHEN condition2 THEN stmt2
ELSE stmt_default
END CASE;
[label:] WHILE condition DO
statements
END WHILE [label];
[label:] LOOP
statements
IF exit_condition THEN LEAVE label; END IF;
END LOOP [label];
[label:] REPEAT
statements
UNTIL condition
END REPEAT [label];
DELIMITER //
CREATE PROCEDURE proc_calc_factorial(IN n INT, OUT result BIGINT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE prod BIGINT DEFAULT 1;
IF n < 0 THEN
SET result = -1; -- 錯誤碼
ELSE
calc_loop: WHILE i <= n DO
SET prod = prod * i;
SET i = i + 1;
END WHILE calc_loop;
SET result = prod;
END IF;
END//
DELIMITER ;
-- 測試
CALL proc_calc_factorial(5, @res);
SELECT @res; -- 120
-- 列出所有程序基本資訊
SHOW PROCEDURE STATUS [LIKE 'pattern'];
-- 查看特定程序完整定義
SHOW CREATE PROCEDURE proc_name;
PREPARE/EXECUTE),防止注入與計畫失效SHOW PROCEDURE STATUS 檢查創建時間、修改時間,配合版控管理