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

Oracle 資料物件分析 (下):程序與函數完整語法與範例

     編輯:Oracle 資料庫相關知識

程序與函數差異回顧

  • 程序:獨立呼叫 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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved