首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 預存程序與函數差異全解析:語法、調用、參數模式

     編輯:Oracle 資料庫基礎

核心差異一覽

維度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 OUTIN、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 中重複呼叫效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved