考えられる解決策の1つ(最終的には簡略化できます)は、テーブル関数を使用してカーソルを処理し、関数値を追加することです。
sys_refcursorを返す関数がget_cur
と呼ばれると仮定します。 カーソルが列ID, NAME
で構成されていること (テーブル関数には型定義が必要なため、これは重要です)。
行(追加のパス列を含む)と結果のテーブルのTYPEを宣言します。
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
カーソルをフェッチして関数呼び出しを追加するテーブル関数を定義します。
create or replace function get_cur2 return
t_rows
PIPELINED
as
cv_out sys_refcursor;
id number;
name varchar2(100);
begin
cv_out := get_cur;
loop
FETCH cv_out INTO id, name;
exit when cv_out%NOTFOUND;
pipe row(t_row(id,name, GetRegionPath(id)));
end loop;
close cv_out;
return;
end;
/
これで、テーブル関数からデータを選択できます
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
もちろん、このクエリを使用して、追加のパス列を含むSYS_REFCURSORを返す3番目の関数でカーソルを開くこともできます。