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

MySQL 預存程序參數模式詳解:IN、OUT、INOUT 傳遞機制與實戰範例

     編輯:MySQL 綜合教學

MySQL 預存程序參數模式詳解:IN、OUT、INOUT 傳遞機制與實戰範例

MySQL 預存程序支援三種參數模式,掌握其傳遞語義是編寫高效過程式碼的基礎。

三種模式對比

模式方向初始值可否在體內修改可否返回給呼叫者適用場景
IN輸入呼叫者提供可修改區域變數,不影響呼叫者否傳入查詢條件、業務參數
OUT輸出NULL(忽略呼叫者傳入值)必須在體內賦值是返回計算結果、狀態碼
INOUT雙向呼叫者提供可修改並返回是累加器、狀態機、雙向資料交換
若不顯式指定,預設為 IN。

實戰範例

範例 1:IN 參數 — 計算 1 到 N 累加和

DELIMITER $$
CREATE PROCEDURE p_sum(IN n INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE total INT DEFAULT 0;
  WHILE i <= n DO
    SET total := total + i;
    SET i := i + 1;
  END WHILE;
  SELECT total AS result;
END$$
DELIMITER ;

-- 呼叫
CALL p_sum(100);  -- 返回 5050

範例 2:OUT 參數 — 返回計算結果

CREATE PROCEDURE p_increment(OUT num INT)
BEGIN
  SELECT num AS before_val;  -- 初始為 NULL
  IF num IS NOT NULL THEN
    SET num := num + 1;
  ELSE
    SET num := 1;
  END IF;
  SELECT num AS after_val;
END$$

-- 呼叫(需用用戶變數接收)
SET @n = 10;
CALL p_increment(@n);
SELECT @n AS result;  -- 返回 11

範例 3:INOUT 參數 — 雙向傳遞

CREATE PROCEDURE p_add20(INOUT age INT)
BEGIN
  SET age := age + 20;
END$$

-- 呼叫
SET @current_age = 18;
CALL p_add20(@current_age);
SELECT @current_age AS result;  -- 返回 38

呼叫語法關鍵點

  • IN:直接傳值 CALL p(10)
  • OUT/INOUT:必須用用戶變數 @var 接收,SET @v=...; CALL p(@v); SELECT @v;
  • OUT 參數呼叫時傳入的值會被忽略(體內初始為 NULL)

進階應用:多 OUT 參數返回多值

CREATE PROCEDURE p_stats(IN table_name VARCHAR(64), 
                         OUT row_count BIGINT, 
                         OUT data_size BIGINT,
                         OUT index_size BIGINT)
BEGIN
  SELECT TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH
  INTO row_count, data_size, index_size
  FROM information_schema.TABLES
  WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = table_name;
END$$

CALL p_stats('orders', @rows, @data, @idx);
SELECT @rows, @data, @idx;

除錯技巧

  • SELECT @var; 檢查變數值
  • 體內用 SELECT 'debug: ', var; 列印中間值
  • SHOW CREATE PROCEDURE p_name; 檢視定義
  • DROP PROCEDURE IF EXISTS p_name; 重建

最佳實踐建議

  1. 盡量用 IN + 結果集返回:SELECT ... 在體內直接返回結果集,呼叫端解析 ResultSet,比 OUT 參數更直觀、兼容性更好
  2. OUT/INOUT 僅用於標量返回:單值狀態碼、計數器、聚合結果
  3. 避免複雜邏輯在預存程序:難以版本控制、難以單元測試、難以除錯、資料庫 CPU 易成瓶頸 — 核心業務邏輯留在應用層
  4. 命名規範:p_ 前綴 + 動詞 + 名詞,如 p_calc_order_total
MySQL 預存程序參數模式設計簡潔實用。實際專案中,90% 場景用 IN + 結果集即可覆蓋,OUT/INOUT 僅在需要返回標量狀態或雙向累加時使用。過度使用預存程序承載業務邏輯是反模式,請謹慎評估。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved