2019年8月19日

Oracle Pipelined Table Functions

Oracle 9i 之後, 有一個功能叫做 Pipelined, 它是一個 Function, 可是用法與 Table 相同, 優點有 :

  • 快速, 不需等查詢執行完畢,每一筆 row 直接回傳結果
  • 執行效率好
  • 可輕易達成複雜的邏輯需求
  • 將程式保留在資料庫
  • 可輸入變數
  • 可達成 Transformation ( 行列轉置 )
簡單的範例如下 :

(Function Code)

CREATE OR REPLACE PACKAGE PIPELINED_FUN_TEST_PKG AS
    TYPE NUMBER_TBL_TYPE IS TABLE OF NUMBER;
    FUNCTION EXAMPLE1(V_MAX_NUMBER NUMBER) RETURN NUMBER_TBL_TYPE PIPELINED;
END PIPELINED_FUN_TEST_PKG;

CREATE OR REPLACE PACKAGE BODY APPS.PIPELINED_FUN_TEST_PKG AS
    FUNCTION EXAMPLE1(V_MAX_NUMBER NUMBER) RETURN NUMBER_TBL_TYPE PIPELINED IS
    BEGIN
        FOR i IN 1..V_MAX_NUMBER LOOP
            PIPE ROW(i);
        END LOOP;
        RETURN;
    END;
END PIPELINED_FUN_TEST_PKG;


(Query)

SELECT * FROM TABLE(PIPELINED_FUN_TEST_PKG.EXAMPLE1(:X))



這樣的功能可以讓很多原本很複雜的處理變得更單純且快速,好比說原本串連很多,且速度不快的 View,可以考慮改寫成這個方式,應該可以加快查詢速度。目前我已使用此功能, 去驗證 Email 欄位是否有不合法的字元。

沒有留言: