1

您能否向我解释一下:我在包规范中有以下内容,而不是使用 Oracle 10g 的正文。

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;

这些有什么关系?从未使用过流水线功能。

我也喜欢一个关于如何在包规范/正文中使用管道功能的非常详细的示例。

谢谢

4

1 回答 1

3

假设您只有规范,我们无法判断是否fraud_ext_Sql由 调用fraud_ext,但它在流水线函数的上下文中无关紧要。

要使用流水线函数,您可以从基本数组/嵌套表类型开始。例如:

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
8J
于 2013-04-02T15:24:07.383 回答