你能给我解释一下吗:我在一个包规范中有以下内容,而不是使用Oracle10g的正文。
TYPE t_fraud_ext IS TABLE OF FI_RPT.FI_Fraud_OBJ;
FUNCTION fraud_ext_Sql
( schema_name IN VARCHAR2
, select_beginning_business_date IN DATE – Start Date
, select_thru_business_date IN DATE – End Date
, select_beginning_business_time IN VARCHAR2 – Start Time
, select_thru_business_time IN VARCHAR2 – End Time
) RETURN VARCHAR2;
FUNCTION fraud_ext
( schema_name IN VARCHAR2
, select_beginning_business_date IN DATE – Start Date
, select_thru_business_date IN DATE – End Date
, select_beginning_business_time IN VARCHAR2 – Start Time
, select_thru_business_time IN VARCHAR2 – End Time
) RETURN t_fraud_ext PIPELINED;这些是如何关联的呢?从未使用过流水线函数。
我也喜欢一个关于如何在包规范/主体中使用流水线函数的非常详细的例子。
谢谢
发布于 2013-04-02 23:24:07
假设你只有一个规范,我们不知道fraud_ext是否调用了fraud_ext_Sql,但它与管道函数的上下文无关。
要使用流水线函数,您可以从基本数组/嵌套表类型开始。例如:
SQL> create type test_typ as object (id number, txt varchar2(20));
2 /
Type created.
SQL> create type test_tab as table of test_typ;
2 /
Type created.因此将在流水线输出中使用test_tab。我们也可以有一个标量数组/嵌套表。例如,这对于使用管道函数也是有效的:
SQL> create type test_tab as table of varchar2(20);
2 /
Type created.一旦拥有了基类型,就可以将函数定义为流水线形式。在下面的示例中,我将函数封装在一个包中,但这不是必需的;也可以使用独立函数。
SQL> create package test_pkg
2 as
3 function get_data(p_id number)
4 return test_tab pipelined;
5 end;
6 /
Package created.pipelined关键字是关键字。包体如下:
SQL> create package body test_pkg
2 as
3
4 function get_data(p_id number)
5 return test_tab pipelined
6 is
7 begin
8 for idx in 1..p_id
9 loop
10 pipe row(test_typ(idx, dbms_random.string('x', 2)));
11 end loop;
12 end get_data;
13
14 end;
15 /
Package body created.PIPE ROW命令将一行泵送回客户端。这(与常规函数不同)立即将行返回给客户端(即,它不会等待整个集合物化后再将行发回),您将看到由客户端中的arraysize设置控制的成批返回的行。这样做的好处是,在将数据发送回客户端之前,Oracle不需要将整个数组保存在内存中。
因此,要调用管道函数,您可以使用table函数,如下所示:
SQL> select *
2 from table(test_pkg.get_data(10));
ID TXT
---------- --------------------
1 3B
2 AM
3 1J
4 36
5 8I
6 BM
7 LS
8 ON
9 5Z
10 D7
10 rows selected.如果你有一个标量数组,就像我之前提到的那样,pipe row命令只有一个值,里面没有任何类型名:
SQL> create type test_tab as table of varchar2(20);
2 /
Type created.
SQL>
SQL> create package test_pkg
2 as
3 function get_data(p_id number)
4 return test_tab pipelined;
5 end;
6 /
Package created.
SQL> create package body test_pkg
2 as
3
4 function get_data(p_id number)
5 return test_tab pipelined
6 is
7 begin
8 for idx in 1..p_id
9 loop
10 pipe row(dbms_random.string('x', 2));
11 end loop;
12 end get_data;
13
14 end;
15 /
Package body created.
SQL> select *
2 from table(test_pkg.get_data(10));
COLUMN_VALUE
--------------------
GS
MJ
PF
D6
NG
WO
22
MV
96
8Jhttps://stackoverflow.com/questions/15767566
复制相似问题