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

MySQL 存儲過程與函數的區別:調用方式、返回值、權限與使用場景對比

     編輯:MySQL 資料庫相關知識

核心差異速查表

維度存儲過程 (PROCEDURE)函數 (FUNCTION)
定義關鍵字CREATE PROCEDURECREATE FUNCTION
調用方式CALL proc_name(...) 獨立語句SELECT func_name(...) 嵌入 SQL 表達式
返回值無返回值,通過 OUT/INOUT 參數回傳多個值必須 返回單一值(標量或表)
參數模式IN、OUT、INOUT僅 IN
事務控制可显式 COMMIT/ROLLBACK、啟動事務不可包含事務控制語句
修改數據可執行 INSERT/UPDATE/DELETE/DDL不可修改全局數據庫狀態(不可寫表)
非確定性可使用 RAND()、UUID() 等默認 DETERMINISTIC,若需非確定性須顯式聲明 NOT DETERMINISTIC
權限CREATE ROUTINE、EXECUTECREATE ROUTINE、EXECUTE
在 SQL 中使用不可直接用於 SELECT/WHERE/FROM可用於 SELECT 列、WHERE 條件、FROM 子查詢(返回表)

典型應用場景

存儲過程

  • 複雜業務邏輯封裝:批量轉賬、報表生成、數據清洗、定時任務核心邏輯。
  • 需事務控制、多步寫入、動態 SQL 構建。
  • 減少應用與資料庫交互往返(網絡延遲)。

函數

  • 可復用的計算/轉換邏輯:金額格式化、狀態碼轉換、自定義聚合、字符串處理。
  • 需在 SELECT 列表、WHERE、JOIN ON 中直接調用。
  • 返回表的 TABLE FUNCTION (MySQL 8.0+) 可用於 FROM func()。

代碼對比

-- 存儲過程:修改數據、多 OUT 參數
CREATE PROCEDURE transfer(IN from_id INT, IN to_id INT, IN amount DECIMAL(10,2),
                          OUT success BOOL, OUT msg VARCHAR(100))
BEGIN
    DECLARE bal DECIMAL(10,2);
    SELECT balance INTO bal FROM account WHERE id = from_id FOR UPDATE;
    IF bal >= amount THEN
        UPDATE account SET balance = balance - amount WHERE id = from_id;
        UPDATE account SET balance = balance + amount WHERE id = to_id;
        SET success = TRUE; SET msg = 'OK';
    ELSE
        SET success = FALSE; SET msg = 'Insufficient balance';
    END IF;
END;

-- 函數:純計算、單返回值
CREATE FUNCTION format_money(amt DECIMAL(10,2)) RETURNS VARCHAR(20)
DETERMINISTIC
RETURN CONCAT('¥', FORMAT(amt, 2));

-- 調用
CALL transfer(1,2,100,@s,@m);
SELECT format_money(balance) FROM account;

選型建議

  1. 需寫數據、事務、多返回值 → 存儲過程。
  2. 純計算、需嵌入 SQL 表達式、單返回值 → 函數。
  3. 現代架構傾向:業務邏輯上移到應用層,資料庫僅做數據存取與約束,存儲過程/函數僅用於極簡、高頻、跨應用復用的邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved