mysql> USE test;
mysql> CREATE PROCEDURE hi() SELECT 'hello';
mysql> CALL hi();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)
單次連線即可執行多條 SQL,大幅降低網路延遲開銷。但需注意:
mysqli 擴展(mysql 舊擴展不支援,會報 can't return a result set in the given context)mysqli::multi_query() + mysqli::next_result() 迴圈處理多結果集| 特性 | Stored Procedure | Stored Function |
|---|---|---|
| 回傳值 | 無(透過 OUT/INOUT 參數) | 必須有 RETURNS |
| 呼叫方式 | CALL sp_name() | SELECT func_name() |
| 在 SQL 中使用 | 不可直接用於 SELECT | 可直接嵌入查詢 |
| 事務控制 | 支援 COMMIT/ROLLBACK | 不支援 |
IN/OUT/INOUT,避免隱性 BugDETERMINISTIC / NO SQL / READS SQL DATA,配合 log_bin_trust_function_creators=1 避免複寫報錯DECLARE ... HANDLER FOR SQLEXCEPTION 捕獲異常EXECUTE 權限,避免直接授表級 DML-- 查看現有程序
SHOW PROCEDURE STATUS WHERE Db='test';
-- 查看程式碼
SHOW CREATE PROCEDURE hi;
儲存程序是資料庫層業務邏輯封裝的利器,善用可大幅提升架構內聚性與效能。現代專案建議搭配 mysqli 或 PDO 使用。