Oracle的管道函数需要定义下面的三样:
Record/Object Type:定义一个Record或Object类型的变量,这个变量用于表示返回结果集的一行数据,有点像C#中的DataRow类。
Table Type:定义一个集合类型,这个类型由Record/Object Type填充。这个类型也可以理解为一个Record/Object的数组。
Function:定义个返回类型为Table Type的函数。这个函数负责生成结果集。
上述三个数据库对象一般定义在一个包内,但是Object Type不能定义在包内,需要在包外部定义,包内引用。
示例:
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;
调用函数:
调用时需要与Table关键字配合使用,如下图所示。