首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 存儲過程參數類型詳解:IN、OUT、INOUT 與用戶變量實戰

     編輯:MySQL 綜合教學

參數模式對比

模式方向調用時賦值過程內可修改返回調用者默認值
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 風格
*/

最佳實踐建議

  1. 優先使用 IN:語義清晰,避免副作用
  2. OUT/INOUT 慎用:增加耦合,調試困難,考慮改用結果集返回
  3. 用戶變量少用:濫用導致代碼難維護,僅用於簡單會話狀態傳遞
  4. 參數命名規範:p_ 前綴區分參數與列名
  5. 異常處理:使用 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;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved