MySQL 預存程序支援三種參數模式,掌握其傳遞語義是編寫高效過程式碼的基礎。
| 模式 | 方向 | 初始值 | 可否在體內修改 | 可否返回給呼叫者 | 適用場景 |
|---|---|---|---|---|---|
| IN | 輸入 | 呼叫者提供 | 可修改區域變數,不影響呼叫者 | 否 | 傳入查詢條件、業務參數 |
| OUT | 輸出 | NULL(忽略呼叫者傳入值) | 必須在體內賦值 | 是 | 返回計算結果、狀態碼 |
| INOUT | 雙向 | 呼叫者提供 | 可修改並返回 | 是 | 累加器、狀態機、雙向資料交換 |
若不顯式指定,預設為 IN。
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
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
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
CALL p(10)@var 接收,SET @v=...; CALL p(@v); SELECT @v;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; 重建SELECT ... 在體內直接返回結果集,呼叫端解析 ResultSet,比 OUT 參數更直觀、兼容性更好p_ 前綴 + 動詞 + 名詞,如 p_calc_order_totalMySQL 預存程序參數模式設計簡潔實用。實際專案中,90% 場景用 IN + 結果集即可覆蓋,OUT/INOUT 僅在需要返回標量狀態或雙向累加時使用。過度使用預存程序承載業務邏輯是反模式,請謹慎評估。