2014-04-23 54 views
2

我有一個數據庫包中的函數,它返回一個流水線對象集合。我希望推廣該功能,以便可以根據不同的數據調用相同的功能。但是,我希望保留現有的兼容性功能。有什麼辦法可以在不循環行的情況下傳遞管道?PL/SQL:你能傳遞一個流水線函數的返回數據嗎?

一個例子,使其更清晰。我有一個函數foo:

FUNCTION foo(some_id in varchar2) return mypackage.mytype pipelined is 
    arFoo mypackage.mytype; 
BEGIN 
    -- do stuff to fill data in arFoo based on some_id 
    for i in nvl(arFoo.first,0) .. nvl(arFoo.last, -1) loop 
    pipe row(arFoo(i)); 
    end loop; 
    return; 
END; 

我將創建一個功能欄,而不是

FUNCTION bar(arData in myParamType) return return mypackage.mytype pipelined is 
    arFoo mypackage.mytype; 
BEGIN 
    -- do stuff to fill data in arFoo based on data in arData 
    for i in nvl(arFoo.first,0) .. nvl(arFoo.last, -1) loop 
    pipe row(arFoo(i)); 
    end loop; 
    return; 
END; 

我會喜歡保留以下列方式FOO:

FUNCTION foo(some_id in varchar2) return mypackage.mytype pipelined is 
    arData myParamType; 
BEGIN 
    -- do stuff to fill data in arData based on some_id 
    return arBar(arData); 
END; 

然而, return arBar(arData);是不允許的 - 流水線功能本身必須有return作爲staement。現在的問題是如何通過bar返回至foo返回我能看到的唯一方法管道連接管道是循環的結果,再管他們:

for r in (select * from table(bar(arData))) loop 
    pipe row(r); 
end loop; 

然而,這令我特別低效。是否有更有效的方法將bar的管道連接到foo的管道而不循環?

回答

0

我將這個作爲aswer提交,因爲它是我如何解決它的。這在某種程度上只是部分答案,因爲我找不到用流水線功能來做這件事的好方法。我所做的是將返回對象創建爲全局用戶定義對象(而不是包規範中的記錄類型),然後直接返回對象。

換句話說,我定義如下的功能:

FUNCTION bar(arData in myParamType) return mytype is 
    arFoo mytype; 
BEGIN 
    -- do stuff to fill data in arFoo based on data in arData 
    return arFoo; 
END; 

FUNCTION foo(some_id in varchar2) return mytype is 
    arData myParamType; 
BEGIN 
    -- do stuff to fill data in arData based on some_id 
    return arBar(arData); 
END; 

並刪除以下(其曾在mypackage的規範)

type mytype is record(
    foo_id foo.id%type 
) 

,而是跑到一個腳本來創建一個全球性的類型

create or replace type mytype as object(
    foo_id number(5,0) 
) 

這意味着使用函數(它是select * from table(foo('x')))保持不變,而我的新內部函數存在,並可以在其他情況下直接調用。

在package spec中定義類型會更簡單,但我們已經有了一些全局對象,所以我們可以處理它。 (我想認爲 oracle在內部定義了全局對象來處理流水線函數)。不幸的是,我們不能在全局對象定義中使用%type,但我們可以忍受這一點。

相關問題