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;
CREATE OR REPLACE FUNCTION get_max_generic(p_list IN SYS.ANYDATA)
RETURN SYS.ANYDATA IS
-- 利用 ANYDATA 實現泛型,略複雜,生產建議針對具體型別多載
...
END;
-- 將集合轉為臨時表或使用 TABLE() 函數
SELECT MAX(COLUMN_VALUE) FROM TABLE(SYS.ODCIDATELIST(
DATE '2002-02-02', DATE '2009-02-02', DATE '2010-02-02'
));
適用於一次性腳本,避免建立永久函數。
GET_MAX_DATE、GET_MAX_NUM 等。SYS.ODCIDATELIST、SYS.ODCINUMBERLIST、SYS.ODCIVARCHAR2LIST,免自訂 TYPE。DETERMINISTIC / RESULT_CACHE 提升效能。一個通用函數,解決 PL/SQL 集合最大值取得的所有場景。