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

Oracle PL/SQL 取得集合中最大日期的通用函數

     編輯:Oracle 資料庫相關知識

PL/SQL 中無內建 GREATEST 支援集合/陣列,需自行迴圈比較。封裝為函數可重用。

通用函數實作

CREATE OR REPLACE FUNCTION get_max_date(p_dates IN SYS.ODCIDATELIST)
RETURN DATE IS
  v_max DATE := NULL;
BEGIN
  IF p_dates IS NULL OR p_dates.COUNT = 0 THEN
    RETURN NULL;
  END IF;
  
  v_max := p_dates(1);
  FOR i IN 2..p_dates.COUNT LOOP
    IF p_dates(i) > v_max THEN
      v_max := p_dates(i);
    END IF;
  END LOOP;
  RETURN v_max;
END;
/

-- 呼叫範例
DECLARE
  v_dates SYS.ODCIDATELIST := SYS.ODCIDATELIST(
    DATE '2002-02-02', DATE '2009-02-02', DATE '2010-02-02'
  );
BEGIN
  DBMS_OUTPUT.PUT_LINE('最大日期:' || get_max_date(v_dates));
END;

進階:支援任意比較型別的泛型寫法 (12c+)

CREATE OR REPLACE FUNCTION get_max_generic(p_list IN SYS.ANYDATA)
RETURN SYS.ANYDATA IS
  -- 利用 ANYDATA 實現泛型,略複雜,生產建議針對具體型別多載
  ...
END;

替代方案:SQL 引擎計算

-- 將集合轉為臨時表或使用 TABLE() 函數
SELECT MAX(COLUMN_VALUE) FROM TABLE(SYS.ODCIDATELIST(
  DATE '2002-02-02', DATE '2009-02-02', DATE '2010-02-02'
));

適用於一次性腳本,避免建立永久函數。

最佳實踐

  • 常用型別 (DATE、NUMBER、VARCHAR2) 建立專用函數 GET_MAX_DATE、GET_MAX_NUM 等。
  • 集合型別優先使用系統內建 SYS.ODCIDATELIST、SYS.ODCINUMBERLIST、SYS.ODCIVARCHAR2LIST,免自訂 TYPE。
  • 若在 SQL 中頻繁呼叫,加 DETERMINISTIC / RESULT_CACHE 提升效能。

一個通用函數,解決 PL/SQL 集合最大值取得的所有場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved