參數模式對比
| 模式 | 方向 | 調用時賦值 | 過程內可修改 | 返回調用者 | 默認值 |
| IN | 輸入 | 必須 | 可修但不返回 | 否 | 是 |
| OUT | 輸出 | 可選(初始為NULL) | 可修改並返回 | 是 | 否 |
| INOUT | 輸入輸出 | 必須 | 可修改並返回 | 是 | 否 |
創建語法
CREATE PROCEDURE sp_name (
[IN|OUT|INOUT] param_name data_type, ...
)
BEGIN
-- 過程體
END;
實戰示例
1. IN 參數 - 僅輸入
CREATE PROCEDURE sp_demo_in (IN p_in INT)
BEGIN
SELECT p_in AS original_value;
SET p_in = 2;
SELECT p_in AS modified_inside;
END;
-- 調用
SET @p_in = 1;
CALL sp_demo_in(@p_in);
SELECT @p_in AS after_call; -- 仍為 1,未被修改
2. OUT 參數 - 僅輸出
CREATE PROCEDURE sp_demo_out (OUT p_out INT)
BEGIN
SELECT p_out AS initial_value; -- NULL
SET p_out = 2;
SELECT p_out AS modified_value;
END;
-- 調用
SET @p_out = 1;
CALL sp_demo_out(@p_out);
SELECT @p_out AS after_call; -- 變為 2
3. INOUT 參數 - 雙向
CREATE PROCEDURE sp_demo_inout (INOUT p_inout INT)
BEGIN
SELECT p_inout AS initial_value; -- 1
SET p_inout = 2;
SELECT p_inout AS modified_value;
END;
-- 調用
SET @p_inout = 1;
CALL sp_demo_inout(@p_inout);
SELECT @p_inout AS after_call; -- 變為 2
用戶變量詳解
特點
- 以
@ 開頭:@var_name
- 會話級作用域,連接斷開自動釋放
- 類型自動推斷,無需聲明
- 可在存儲過程間傳遞數據
基本操作
-- 賦值
SET @x = 'Hello World';
SELECT 'Hello World' INTO @x;
SET @y = 1 + 2 + 3;
-- 使用
SELECT @x;
SELECT CONCAT(@greeting, ' World');
-- 存儲過程間傳遞
CREATE PROCEDURE p1() SET @last_proc = 'p1';
CREATE PROCEDURE p2() SELECT CONCAT('Last: ', @last_proc);
CALL p1();
CALL p2(); -- 返回 'Last: p1'
註釋風格
-- 單行註釋(雙減號加空格)
/*
多行註釋
C 風格
*/
最佳實踐建議
- 優先使用 IN:語義清晰,避免副作用
- OUT/INOUT 慎用:增加耦合,調試困難,考慮改用結果集返回
- 用戶變量少用:濫用導致代碼難維護,僅用於簡單會話狀態傳遞
- 參數命名規範:
p_ 前綴區分參數與列名
- 異常處理:使用
DECLARE ... HANDLER 捕獲錯誤
調試技巧
-- 查看過程定義
SHOW CREATE PROCEDURE sp_name;
-- 查看所有過程
SHOW PROCEDURE STATUS WHERE Db = 'db_name';
-- 執行過程跟蹤(需開啟 general_log)
SET GLOBAL general_log = 1;
CALL sp_name(...);
SET GLOBAL general_log = 0;