存儲過程通過參數實現與調用者的數據交換。MySQL 支援三種參數模式:IN(輸入)、OUT(輸出)、INOUT(雙向)。本文以實例講解語法、調用方式與常見坑。
| 模式 | 方向 | 調用者可見性 | 過程內初始值 | 典型用途 |
|---|---|---|---|---|
| IN | 調用者 → 過程 | 只讀 | 調用者傳入值 | 查詢條件、業務參數 |
| OUT | 過程 → 調用者 | 寫入後可讀 | NULL(需賦值) | 返回計算結果、狀態碼 |
| INOUT | 雙向 | 讀寫 | 調用者傳入值 | 累加器、雙向狀態 |
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
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
SET @x = 0; 否則為 NULL 導致運算結果為 NULL。EXECUTE 權限;定義者需 CREATE ROUTINE。
// 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();