[英]PL/SQL: Can you pass the returned data from a pipelined function on?
我在數據庫包中有一個函數,該函數返回管道對象集合。 我希望對此功能進行概括,以便可以基於不同的數據調用相同的功能。 但是,我希望保留現有功能以保持兼容性。 有什么方法可以在不循環行的情況下繼續傳遞管道嗎?
使其更清楚的示例。 我有一個函數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
。 問題是如何將bar
返回的管道連接到foo
返回的管道。我唯一看到的方法是循環結果並再次管道化它們:
for r in (select * from table(bar(arData))) loop
pipe row(r);
end loop;
但是,這使我感到特別低效。 有沒有更有效的方法可以將bar
的管道連接到foo
的管道而無需循環?
我將其提交,因為這是我解決的方法。 在某些方面,這只是部分答案,因為我找不到使用流水線函數執行此操作的好方法。 我要做的是將返回對象創建為全局用戶定義的對象(而不是程序包規范中的記錄類型),然后直接返回該對象。
換句話說,我定義了如下功能:
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'))
變體)保持不變,並且可以在其他情況下直接調用。
在軟件包規范中定義類型會比較整潔,但是我們已經有了一些全局對象,因此我們可以對其進行處理。 (我認為 oracle在內部定義了全局對象以處理管道函數。) 不幸的是,我們不能在全局對象定義中使用%type
,但是我們可以接受。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.