完整代碼
DROP PROCEDURE IF EXISTS my_procedure;
CREATE PROCEDURE my_procedure(
IN my_id INT,
OUT my_name CHAR(50)
)
BEGIN
SELECT list_name INTO my_name
FROM aa_list
WHERE list_id = my_id;
END;
-- 調用示例
CALL my_procedure(24, @a);
SELECT @a;
參數模式詳解
| 模式 | 關鍵字 | 方向 | 說明 |
| 輸入 | IN | 調用者 → 過程 | 默認模式,過程內可讀不可寫(修改不影響外部) |
| 輸出 | OUT | 過程 → 調用者 | 過程內初始為 NULL,需賦值,返回給調用者 |
| 輸入輸出 | INOUT | 雙向 | 調用者傳入初始值,過程可修改並返回新值 |
調用細節
- OUT/INOUT 參數必須傳遞用戶變量(@var)接收返回值
CALL proc(@out_var); 後用 SELECT @out_var; 查看結果
- 同一會話中用戶變量持久化,可跨多次調用復用
INOUT 進階示例:計算器
CREATE PROCEDURE calc(INOUT value INT, IN operand INT, IN operator CHAR(1))
BEGIN
CASE operator
WHEN '+' THEN SET value = value + operand;
WHEN '-' THEN SET value = value - operand;
WHEN '*' THEN SET value = value * operand;
WHEN '/' THEN SET value = value / operand;
END CASE;
END;
-- 使用
SET @result = 10;
CALL calc(@result, 5, '+'); -- @result = 15
CALL calc(@result, 3, '*'); -- @result = 45
SELECT @result;
最佳實踐
- 明確指定
IN/OUT/INOUT,提高可讀性
- OUT 參數在過程開頭初始化(如
SET out_param = '';)
- 避免過多 OUT 參數,考慮返回結果集或 JSON
- 文檔化參數含義、預期數據類型、邊界條件