核心差異一覽
| 維度 | Procedure (程序) | Function (函數) |
| 回傳值 | 無(但可透過 OUT/IN OUT 參數回傳多值) | 必須有單一回傳值(RETURN 型別) |
| 調用方式 | 獨立 PL/SQL 陳述式:proc_name(...); | 嵌入 SQL/PL/SQL 運算式:v := func_name(...); |
| SQL 中使用 | 不可直接用於 SELECT/WHERE | 可直接用於 SELECT、WHERE、ORDER BY 等 |
| 參數模式 | IN、OUT、IN OUT | IN、OUT、IN OUT(但建議純 IN) |
調用範例對比
-- Procedure:獨立呼叫
pay_invoice(invoice_nbr, 30, due_date);
-- Function:運算式中呼叫
order_volume := open_orders(SYSDATE, 30);
建立語法對比
Procedure
CREATE [OR REPLACE] PROCEDURE [schema.]proc_name
[parameter_list]
{AS | IS}
declaration_section
BEGIN
executable_section
[EXCEPTION
exception_section]
END [proc_name];
Function
CREATE [OR REPLACE] FUNCTION [schema.]func_name
[parameter_list]
RETURN return_datatype
{AS | IS}
declaration_section
BEGIN
executable_section
RETURN expr; -- 必須至少一個 RETURN
[EXCEPTION
exception_section]
END [func_name];
參數模式詳細說明
| 模式 | 傳入值 | 體內可讀 | 體內可寫 | 返回呼叫端 |
| IN (預設) | 是 | 是 | 否 | 否(值不變) |
| OUT | 否(忽略) | 否 | 是 | 是(最終值) |
| IN OUT | 是 | 是 | 是 | 是(最終值) |
Function 中使用 SQL 聚合函數範例
CREATE OR REPLACE FUNCTION my_sin(p_deg IN NUMBER) RETURN NUMBER IS
v_pi NUMBER := ACOS(-1);
v_rad_per_deg NUMBER;
BEGIN
v_rad_per_deg := v_pi / 180;
RETURN SIN(p_deg * v_rad_per_deg);
END;
/
選擇指南
- 需在 SQL 陳述式中直接呼叫 → Function。
- 執行複雜業務邏輯、DML 操作、多步驟流程、無單一回傳值 → Procedure。
- 需回傳多個相關值 → Procedure 用 OUT 參數,或 Function 回傳物件型別/集合。
- Function 應盡量保持「無副作用」(不修改資料庫狀態),便於優化器重寫與結果快取。
權限管理差異
GRANT EXECUTE ON proc TO user; 兩者相同。
- Function 若標記
DETERMINISTIC,相同輸入會快取結果,提升 SQL 中重複呼叫效能。