2014-03-24 43 views
2

我有一些管道函数:尾呼吁流水线功能

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

这是可能的,但前提是你没有将第二个函数声明为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