从Oracle包函数中获取结果返回表

时间:2015-01-22 18:53:26

标签: oracle plsql

我们的数据库有一个返回类型t_daily_array_table的包。

此类型定义为:

  TYPE t_daily_array_table IS TABLE OF r_daily_array_rec

r_daily_array_rec被定义为具有多个字段的记录。

我们有一个名为schedule_pkg的软件包,函数f_daily_array_table返回t_daily_array_table。该函数只需一个Number参数。

我尝试过多种方式调用它,但我似乎无法让它工作(我知道这个功能有效。它来自一个功能很好的COBOL应用程序)。

我试过了:

select schedule_pkg.f_daily_array_table(74501) from dual;

当我这样做时,我得到了

SQL Error: ORA-00902: invalid datatype

我试过了:

select * from schedule_pkg.f_daily_array_table(74501)

这让我:

SQL Error: ORA-00933: SQL command not properly ended

我尝试过使用代码(C#)并使用OleDb,OracleClient和ODBC以各种方式调用,除了使用COBOL之外,我还没有找到一种方法可以调用它。

2 个答案:

答案 0 :(得分:2)

如果要查询SQL上下文中的值但具有PL / SQL集合类型,可以在包中创建流水线包装函数,也可以作为测试/调试的独立对象。这样的事情应该有效:

create function f_daily_array_pipe(p_id IN number)
return schedule_pkg.t_daily_array_table pipelined is
  l_daily_array_table schedule_pkg.t_daily_array_table;
begin
  l_daily_array_table := schedule_pkg.f_daily_array_table(p_id);
  for i in 1..l_daily_array_table.count loop
    pipe row (l_daily_array_table(i));
  end loop;
end f_daily_array_pipe;
/

select * from table(f_daily_array_pipe(74501));

这将调用您的原始函数,将结果分配给本地集合,对其进行迭代,然后将每个记录依次发送回调用者;它使用SQL table()集合表达式将其转换为您可以查询的内容。

SQL Fiddle demo

如果您使用的是OCI或JDBC客户端,您可以使用数组描述符并将数据作为数组检索,但这不会使用纯SQL。

答案 1 :(得分:0)

我认为您正在寻找的语法是:

select * from table(schedule_pkg.f_daily_array_table(74501));