| 特性 | 存儲過程 | 函數 |
|---|---|---|
| 關鍵字 | CREATE PROCEDURE | CREATE FUNCTION |
| 返回值 | 無 (用 OUT 參數/結果集) | 必須 RETURN 標量值 |
| 調用方式 | CALL sp_name() | SELECT func_name() / SQL 表達式中 |
| 事務控制 | 支援 COMMIT/ROLLBACK | 不支援 |
| 動態 SQL | 支援 PREPARE/EXECUTE | 不支援 |
| 表操作 | 可 DML/DDL | 僅讀/決定性寫入受限 |
CREATE PROCEDURE sp_get_user (IN uid INT, OUT uname VARCHAR(50))
BEGIN
SELECT username INTO uname FROM users WHERE id = uid;
END;
CREATE FUNCTION fn_get_username (uid INT)
RETURNS VARCHAR(50)
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE uname VARCHAR(50);
SELECT username INTO uname FROM users WHERE id = uid;
RETURN uname;
END;
DETERMINISTIC:相同輸入必得相同輸出,優化器可緩存結果。NOT DETERMINISTIC:含隨機/時間等非確定邏輯。READS SQL DATA:只讀數據。MODIFIES SQL DATA:修改數據 (過程默認,函數需聲明)。CONTAINS SQL:不讀寫表,純計算。NO SQL:無 SQL 語句。-- 過程
CALL sp_get_user(1, @name);
SELECT @name;
-- 函數
SELECT fn_get_username(1);
SELECT * FROM users WHERE name = fn_get_username(2);
CREATE ROUTINE 權限。EXECUTE 權限。SHOW CREATE PROCEDURE/FUNCTION。DROP PROCEDURE/FUNCTION 需 ALTER ROUTINE。CREATE DEFINER = 'root'@'%' PROCEDURE sp_xxx ... -- 默認,以創建者權限執行
CREATE DEFINER = 'app_user'@'%' PROCEDURE sp_xxx SQL SECURITY INVOKER ... -- 以調用者權限執行
生產環境推薦 SQL SECURITY INVOKER,避免權限提升風險。
max_sp_recursion_depth 限制 (默認 0 禁用)。EXECUTE 特定過程,無表直訪權限。