从打包函数返回集合以供select使用

Tow*_*ube 2 oracle plsql

我目前正在使用这段代码从我的函数中返回一组行.

--Source: http://www.adp-gmbh.ch/ora/plsql/coll/return_table.html

create or replace type t_col as object (
i number,
n varchar2(30)
);
/
create or replace type t_nested_table as table of t_col;
/
create or replace function return_table return t_nested_table as
  v_ret   t_nested_table;
begin
  v_ret  := t_nested_table();

  v_ret.extend;
  v_ret(v_ret.count) := t_col(1, 'one');

  v_ret.extend;
  v_ret(v_ret.count) := t_col(2, 'two');

  v_ret.extend;
  v_ret(v_ret.count) := t_col(3, 'three');

  return v_ret;
end return_table;
/
Run Code Online (Sandbox Code Playgroud)

我通过发出SQL来调用它

select * from table(return_table);
Run Code Online (Sandbox Code Playgroud)

无法在包中定义对象类型,我尝试使用有效的记录类型(在PL/SQL中),但我无法以与此相同的方式从中进行选择.

如何使用包内的函数实现此结果?

Vin*_*rat 7

您可以在包中使用SQL对象,也可以使用流水线函数(使用10gr2测试).使用SQL对象非常简单,您的实际功能可以在包内使用.

以下是如何使用带有RECORD类型的流水线函数:

SQL> CREATE OR REPLACE PACKAGE my_pkg IS
  2     TYPE t_col IS RECORD(
  3        i NUMBER,
  4        n VARCHAR2(30));
  5     TYPE t_nested_table IS TABLE OF t_col;
  6     FUNCTION return_table RETURN t_nested_table PIPELINED;
  7  END my_pkg;
  8  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY my_pkg IS
  2     FUNCTION return_table RETURN t_nested_table PIPELINED IS
  3        l_row t_col;
  4     BEGIN
  5        l_row.i := 1;
  6        l_row.n := 'one';
  7        PIPE ROW(l_row);
  8        l_row.i := 2;
  9        l_row.n := 'two';
 10        PIPE ROW(l_row);
 11        RETURN;
 12     END;
 13  END my_pkg;
 14  /

Package body created

SQL> select * from table(my_pkg.return_table);

         I N
---------- ------------------------------
         1 one
         2 two
Run Code Online (Sandbox Code Playgroud)

在场景背后发生的事情是Oracle理解由于你想在查询中使用你的函数(因为PIPELINED关键字),你需要SQL对象,所以这些对象是在场景后面为你创建的:

SQL> select object_name
  2    from user_objects o
  3   where o.created > sysdate - 1
  4     and object_type = 'TYPE';

OBJECT_NAME
--------------------------------------------------------------------------------
SYS_PLSQL_798806_24_1
SYS_PLSQL_798806_DUMMY_1
SYS_PLSQL_798806_9_1

SQL> select text from user_source where name='SYS_PLSQL_798806_9_1';

TEXT
--------------------------------------------------------------------------------
type        SYS_PLSQL_798806_9_1 as object (I NUMBER,
N VARCHAR2(30));
Run Code Online (Sandbox Code Playgroud)