預存程序將商業邏輯封裝在資料庫層,減少網路傳輸、提升安全性與維護性。本文說明 MySQL 預存程序的語法、定界符處理、建立/呼叫/刪除操作與參數模式。
CREATE PROCEDURE proc_name ([IN | OUT | INOUT] param_name data_type)
BEGIN
statement_list
END
MySQL 預設以分號 ; 結束語句,但預存程序內部包含多條語句,需暫時變更定界符:
DELIMITER //
建立完成後記得改回 DELIMITER ;
DELIMITER //
CREATE PROCEDURE hello()
BEGIN
SELECT 'Hello World!';
END //
DELIMITER ;
-- 呼叫
CALL hello();
-- 結果
+-----------------+
| Hello World! |
+-----------------+
| Hello World! |
+-----------------+
| 模式 | 方向 | 用途 | 範例 |
|---|---|---|---|
| IN | 輸入 | 傳入值,程序內可讀不可改 (預設) | IN p_id INT |
| OUT | 輸出 | 程序內賦值,呼叫端可取得 | OUT p_count INT |
| INOUT | 雙向 | 傳入並可能被修改回傳 | INOUT p_total DECIMAL(10,2) |
DELIMITER //
CREATE PROCEDURE get_user_order_total (
IN p_user_id INT,
OUT p_total DECIMAL(10,2)
)
BEGIN
SELECT COALESCE(SUM(amount), 0) INTO p_total
FROM orders
WHERE user_id = p_user_id;
END //
DELIMITER ;
-- 呼叫
SET @total = 0;
CALL get_user_order_total(123, @total);
SELECT @total; -- 顯示結果
-- 查看預存程序
SHOW PROCEDURE STATUS WHERE Db = 'mydb';
SHOW CREATE PROCEDURE get_user_order_total;
-- 刪除
DROP PROCEDURE IF EXISTS hello;
掌握 DELIMITER 切換、IN/OUT/INOUT 參數模式、CALL 呼叫與 DROP 管理,即可在 MySQL 中落地預存程序。權衡封裝效益與除錯維護成本,適度使用。