Oracle管道函数示例

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关键字配合使用,如下图所示。

posted @ 2013-09-12 21:46  数据狐  阅读(566)  评论(0编辑  收藏  举报