Jednym z możliwych rozwiązań (które w końcu można uprościć) jest użycie funkcji tabeli do przetwarzania kursora i dodania wartości funkcji.
Załóżmy, że funkcja zwracająca sys_refcursor nazywa się get_cur
i że kursor składa się z kolumny ID, NAME
(jest to ważne, ponieważ funkcja tabeli wymaga definicji typu).
Deklarujesz TYP dla wiersza (włącznie z dodatkową kolumną ścieżki) oraz dla wynikowej tabeli.
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
i zdefiniuj funkcję tabeli, która pobiera kursor i dodaje wywołanie funkcji.
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;
/
Teraz możesz wybrać dane z funkcji tabeli
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
i oczywiście możesz użyć tego zapytania, aby otworzyć kursor w trzeciej funkcji, która zwróci SYS_REFCURSOR z dodatkową kolumną ścieżki.