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

- 快速, 不需等查詢執行完畢,每一筆 row 直接回傳結果

- 執行效率好

- 可輕易達成複雜的邏輯需求

- 將程式 keep 在資料庫

- 可輸入變數

- 可達成 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))

(用途)

可以利用這樣的方式, 產生出一個虛擬的連續數字 Table, 用來判斷單據是否有跳號問題 (Move Order#, Delivery#)

 

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

arrow
arrow
    全站熱搜

    Aloz 發表在 痞客邦 留言(0) 人氣()