2014-03-24 38 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