首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 帶輸入輸出參數存儲過程實戰:IN/OUT/INOUT 參數詳解

     編輯:MySQL 資料庫相關知識

MySQL 存儲過程參數模式實戰:IN、OUT、INOUT 完整指南

存儲過程通過參數實現與調用者的數據交換。MySQL 支援三種參數模式:IN(輸入)、OUT(輸出)、INOUT(雙向)。本文以實例講解語法、調用方式與常見坑。

一、參數模式對比

模式方向調用者可見性過程內初始值典型用途
IN調用者 → 過程只讀調用者傳入值查詢條件、業務參數
OUT過程 → 調用者寫入後可讀NULL(需賦值)返回計算結果、狀態碼
INOUT雙向讀寫調用者傳入值累加器、雙向狀態

二、完整範例:根據 ID 長度返回編碼


DELIMITER //

DROP PROCEDURE IF EXISTS `p_getvalue` //
CREATE PROCEDURE `p_getvalue`(
    IN  p_id VARCHAR(20),   -- 輸入參數
    OUT p_result VARCHAR(20) -- 輸出參數
)
BEGIN
    IF LENGTH(p_id) = 11 THEN
        SET p_result = 'A_B_C_D';
    ELSEIF LENGTH(p_id) = 8 THEN
        SET p_result = 'A_B_C';
    ELSEIF LENGTH(p_id) = 5 THEN
        SET p_result = 'A_B';
    ELSEIF LENGTH(p_id) = 2 THEN
        SET p_result = 'A';
    ELSE
        SET p_result = 'UNKNOWN';
    END IF;
    -- 也可用 SELECT ... INTO
    -- SELECT 'A_B_C' INTO p_result;
END //

DELIMITER ;

三、調用方式


-- 1. 使用用戶變量接收 OUT 參數
CALL p_getvalue('11000112', @result);
SELECT @result;  -- 輸出: A_B_C

-- 2. 多個 OUT 參數
CREATE PROCEDURE p_calc(IN a INT, IN b INT, OUT sum INT, OUT diff INT)
BEGIN
    SET sum = a + b;
    SET diff = a - b;
END;

CALL p_calc(10, 3, @s, @d);
SELECT @s AS sum, @d AS diff;  -- 13, 7

四、INOUT 範例:累加器


CREATE PROCEDURE p_accumulate(INOUT counter INT, IN increment INT)
BEGIN
    SET counter = counter + increment;
END;

SET @cnt = 100;
CALL p_accumulate(@cnt, 5);
SELECT @cnt;  -- 105
CALL p_accumulate(@cnt, -3);
SELECT @cnt;  -- 102

五、關鍵注意事項

  1. OUT/INOUT 必須用用戶變量(@var)接收,不能用字面量或表列。
  2. 過程內 OUT 參數未賦值則為 NULL,調用後讀取也是 NULL。
  3. INOUT 調用前必須初始化:SET @x = 0; 否則為 NULL 導致運算結果為 NULL。
  4. 函數只能返回單值,需多返回值時必須用存儲過程 + OUT 參數。
  5. 權限:調用者需有 EXECUTE 權限;定義者需 CREATE ROUTINE。
  6. DELIMITER:創建過程時必須修改分隔符,避免過程體內分號被誤判為結束。

六、應用層調用


// Java (JDBC)
CallableStatement cs = conn.prepareCall("{CALL p_getvalue(?, ?)}");
cs.setString(1, "11000112");
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
String result = cs.getString(2);
cs.close();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved