Oracle的管道函數須要定義下面的三樣:數據庫
Record/Object Type:定義一個Record或Object類型的變量,這個變量用於表示返回結果集的一行數據,有點像C#中的DataRow類。數組
Table Type:定義一個集合類型,這個類型由Record/Object Type填充。這個類型也能夠理解爲一個Record/Object的數組。函數
Function:定義個返回類型爲Table Type的函數。這個函數負責生成結果集。spa
上述三個數據庫對象通常定義在一個包內,可是Object Type不能定義在包內,須要在包外部定義,包內引用。code
示例:對象
1 CREATE OR REPLACE PACKAGE PCK_TEST AS 2 3 TYPE TYPE_TEST IS RECORD 4 ( 5 R_VAL NUMBER, 6 DATE_VALUE DATE, 7 TEST_FIELD VARCHAR2(50 BYTE) 8 ); 9 10 TYPE TABLE_TEST IS TABLE OF TYPE_TEST; 11 12 FUNCTION F_TEST_TABLE(P_DATE IN VARCHAR2) RETURN TABLE_TEST PIPELINED; 13 14 END PCK_TEST;
1 CREATE OR REPLACE PACKAGE BODY PCK_TEST AS 2 3 FUNCTION F_TEST_TABLE(P_DATE IN VARCHAR2) RETURN TABLE_TEST PIPELINED IS 4 5 L_ROW TYPE_TEST; 6 7 BEGIN 8 9 FOR I IN 1..10 10 LOOP 11 12 L_ROW.R_VAL := I; 13 L_ROW.DATE_VALUE := TO_DATE(P_DATE,'YYYY-MM-DD HH24:MI:SS'); 14 L_ROW.TEST_FIELD := 'TEST'; 15 ---若是TYPE_TEST定義爲Object類型,則能夠這麼賦值 16 ---L_ROW := TYPE_TEST(I,TO_DATE(P_DATE,'YYYY-MM-DD HH24:MI:SS'),'TEST') 17 PIPE ROW(L_ROW); 18 19 20 END LOOP; 21 RETURN; 22 23 EXCEPTION 24 --YOUR EXCEPTION SQL STATEMENT 25 WHEN OTHERS THEN RETURN; 26 END F_TEST_TABLE; 27 28 29 END PCK_TEST;
調用函數:blog
調用時須要與Table關鍵字配合使用,以下圖所示。io