我们的数据库有一个返回类型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之外,我还没有找到一种方法可以调用它。
答案 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()
集合表达式将其转换为您可以查询的内容。
如果您使用的是OCI或JDBC客户端,您可以使用数组描述符并将数据作为数组检索,但这不会使用纯SQL。
答案 1 :(得分:0)
我认为您正在寻找的语法是:
select * from table(schedule_pkg.f_daily_array_table(74501));