MySQL 5.0+ 引入存儲過程,將業務邏輯下沉至數據庫層,可減少網絡交互、提升效能、封裝邏輯並強化安全。本文系統梳理創建語法、三種參數模式(IN/OUT/INOUT)、變量定義與註釋規範,附完整可執行示例。
CREATE PROCEDURE 過程名 ([參數列表])
[特性 ...]
過程體
關鍵點:分隔符重定義
MySQL 預設以分號 ; 為語句結束符,存儲過程體內含多條語句,若不變更分隔符,解析器會在第一個分號處截斷。標準做法:
DELIMITER // -- 臨時改用 // 為結束符
CREATE PROCEDURE proc1(OUT s INT)
BEGIN
SELECT COUNT(*) INTO s FROM user;
END
//
DELIMITER ; -- 恢復預設分隔符
| 模式 | 關鍵字 | 方向 | 特性 | 默認 |
|---|---|---|---|---|
| 輸入參數 | IN | 調用者 → 過程 | 過程內修改不返回 | 是 |
| 輸出參數 | OUT | 過程 → 調用者 | 需在過程內賦值,調用時接收 | 否 |
| 輸入輸出 | INOUT | 雙向 | 調用時傳入,過程可改並返回 | 否 |
CREATE PROCEDURE demo_in(IN p_in INT)
BEGIN
SELECT p_in; -- 查看傳入值
SET p_in = 2; -- 內部修改
SELECT p_in; -- 修改後值(不返回調用者)
END
CREATE PROCEDURE demo_out(OUT p_out INT)
BEGIN
SELECT p_out; -- 初始為 NULL
SET p_out = 2; -- 必須賦值
SELECT p_out; -- 返回 2 給調用者
END
CREATE PROCEDURE demo_inout(INOUT p_inout INT)
BEGIN
SELECT p_inout; -- 顯示傳入值
SET p_inout = 2; -- 修改
SELECT p_inout; -- 返回新值
END
DECLARE var_name TYPE [DEFAULT val]; 僅在 BEGIN...END 塊內有效,塊結束即銷毀。@var_name 以 @ 開頭,綁定當前會話,跨過程可見,會話結束消失。SET SESSION/GLOBAL var=val; 或 SET @@session./@@global.var=val; 影響當前會話或所有會話。-- 註釋內容(雙減號後**必須有空格**)/* 註釋內容 */注意://非 MySQL 標準單行註釋,僅部分客戶端支援,建議統一用--。
CALL proc1(@result); -- 調用 OUT 參數過程
SELECT @result; -- 查看返回值
DROP PROCEDURE IF EXISTS proc1; -- 刪除
sp_業務域_動作(如 sp_order_create),便於檢索與治理。