我有一些流水线功能:
create type my_tab_type as table of ...
create function my_func (X in number) return my_tab_type pipelined as
begin
loop
...
pipe row (...);
end loop;
return;
end;
现在我想创建另一个流水线函数my_func_zero
,其作用与my_func
相同,但对于参数的固定值:my_func_zero
必须等同于my_func(0)
。
我是否可以在没有无意义和无聊的循环的情况下实现my_func_zero
来处理select * from table(my_func(0))
返回的每一行?
P.S。 That线程有点类似,但它不包含我的问题的答案。
答案 0 :(得分:1)
这是可能的,但前提是你没有将第二个函数声明为pipelined
,因为此类型的所有函数都会逐行返回结果。
如果您省略此要求,则可以使用批量收集来访问目标:
create function my_zero_func return my_tab_type
as
res_table my_tab_type;
begin
select my_type(field1, field2)
bulk collect into res_table
from table(my_func(0));
return res_table;
end;
或者你可以使用无类型游标:
create function my_ref_zero_func return sys_refcursor
as
vRes sys_refcursor;
begin
open vRes for select * from table(my_func(0));
return vRes;
end;
在客户端应用程序中my_ref_zero_func
可以使用结果而不进行更改,但在SQLFiddle中它会转换为XML表示形式,因为无法使用此工具演示ref cursor
。