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 欄位是否有不合法的字元
全站熱搜