程序與函數差異回顧
- 程序:獨立呼叫
proc(...);,無 RETURN,透過 OUT/INOUT 參數回傳。
- 函數:表達式一部分
v := func(...);,必須有 RETURN 值。
建立程序完整語法
CREATE [OR REPLACE] PROCEDURE [schema.]proc_name
[(param_name [IN|OUT|IN OUT] datatype [DEFAULT expr] [, ...])]
{AS|IS}
[declaration_section]
BEGIN
executable_section
[EXCEPTION exception_section]
END [proc_name];
參數模式
IN:唯讀,呼叫端傳入值,預設。
OUT:唯寫,忽略傳入值,僅回傳賦值結果。
IN OUT:可讀可寫,傳入並回傳更新值。
建立函數完整語法
CREATE [OR REPLACE] FUNCTION [schema.]func_name
[(param_name [IN|OUT|IN OUT] datatype [DEFAULT expr] [, ...])]
RETURN return_datatype
{AS|IS}
[declaration_section]
BEGIN
executable_section -- 至少一個 RETURN
[EXCEPTION exception_section]
END [func_name];
範例:自訂正弦函數 (度數輸入)
CREATE OR REPLACE FUNCTION my_sin(p_degrees IN NUMBER) RETURN NUMBER IS
v_pi CONSTANT NUMBER := ACOS(-1);
v_rad_per_deg CONSTANT NUMBER := v_pi / 180;
BEGIN
RETURN SIN(p_degrees * v_rad_per_deg);
END my_sin;
呼叫示範
-- 程序
pay_invoice(12345, 30, SYSDATE+30);
-- 函數
v_order_vol := open_orders(SYSDATE, 30);
最佳實務補充
- 函數若為確定性 (相同輸入必得相同輸出) 加
DETERMINISTIC,可用於函數索引、物化視圖、結果快取。
- 11g+ 熱門查詢函數加
RESULT_CACHE,跨 Session 共用結果。
- 大型系統建議將相關程序/函數封裝為 Package,公開規格 (Spec) 隱藏主體 (Body),減少編譯連鎖、利於權限管理。
- 避免在函數中執行 DML,若必須加
PRAGMA AUTONOMOUS_TRANSACTION。