簡體   English   中英

PL / SQL:可以傳遞管道函數返回的數據嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM