Tail调用流水线函数

时间:2014-03-24 18:00:04

标签: oracle plsql

我有一些流水线功能:

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线程有点类似,但它不包含我的问题的答案。

1 个答案:

答案 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;

SQLFiddle

在客户端应用程序中my_ref_zero_func可以使用结果而不进行更改,但在SQLFiddle中它会转换为XML表示形式,因为无法使用此工具演示ref cursor