存儲過程將 SQL 邏輯封裝在服務端,減少網絡交互、防注入、提升性能。本文通過 person 表演示四種參數模式的創建與調用。
CREATE TABLE person (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255),
age INT,
password VARCHAR(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE PROCEDURE proc_find_by_id(IN n INT)
BEGIN
SELECT * FROM person WHERE id = n;
END;
SET @n = 2;
CALL proc_find_by_id(@n);
調用時必須傳值,過程內修改不返回。
CREATE PROCEDURE proc_get_count(OUT n INT)
BEGIN
SELECT COUNT(*) INTO n FROM person;
END;
CALL proc_get_count(@n);
SELECT @n AS total;
過程內賦值,調用後通過會話變量獲取結果。
CREATE PROCEDURE proc_find_info(
IN n INT,
OUT p_username VARCHAR(255),
OUT p_age INT
)
BEGIN
SELECT username, age INTO p_username, p_age FROM person WHERE id = n;
END;
SET @id = 2;
CALL proc_find_info(@id, @username, @age);
SELECT @username, @age;
CREATE PROCEDURE proc_get_age(INOUT n INT)
BEGIN
SELECT age INTO n FROM person WHERE id = n;
END;
SET @id = 1;
CALL proc_get_age(@id);
SELECT @id; -- 返回 age 值
同一變量既傳入查詢條件,又承接結果。
| 模式 | 關鍵字 | 調用時 | 過程內修改 | 返回調用者 |
|---|---|---|---|---|
| 輸入 | IN | 必傳 | 允許 | 不返回 |
| 輸出 | OUT | 必傳變量 | 必須賦值 | 返回 |
| 輸入輸出 | INOUT | 必傳變量 | 可讀可寫 | 返回 |
@var 用於傳入/接收 OUT/INOUT 值。CALL proc(@in_var, @out_var, @inout_var);SELECT @out_var, @inout_var; 查看結果。SHOW CREATE PROCEDURE proc_find_by_id;
SHOW PROCEDURE STATUS WHERE Db = 'test';
掌握 IN/OUT/INOUT 三種模式,即可覆蓋 90% 存儲過程參數交互場景。實際開發中:查詢類用 IN+OUT,統計類用 OUT,原地轉換用 INOUT,配合應用層調用實現業務邏輯下沉。