Eine mögliche Lösung (die eventuell vereinfacht werden könnte) besteht darin, eine Tabellenfunktion zu verwenden, um den Cursor zu verarbeiten und den Funktionswert hinzuzufügen.
Angenommen, die Funktion, die den sys_refcursor zurückgibt, heißt get_cur
und dass der Cursor aus der Spalte ID, NAME
besteht (Dies ist wichtig, da die Tabellenfunktion eine Typdefinition erfordert).
Sie deklarieren den TYP für die Zeile (einschließlich der zusätzlichen Pfadspalte) und für die resultierende Tabelle.
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
und definieren Sie die Tabellenfunktion, die den Cursor holt und den Funktionsaufruf hinzufügt.
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;
/
Nun können Sie die Daten aus der Tabellenfunktion auswählen
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
und natürlich können Sie diese Abfrage verwenden, um einen Cursor in einer dritten Funktion zu öffnen, die den SYS_REFCURSOR mit der zusätzlichen Pfadspalte zurückgibt.