En möjlig lösning (som så småningom skulle kunna förenklas) är att använda en tabellfunktion för att bearbeta markören och lägga till funktionsvärdet.
Antag att funktionen som returnerar sys_refcursor heter get_cur
och att markören består av kolumnen ID, NAME
(detta är viktigt, eftersom tabellfunktionen kräver typdefinition).
Du deklarerar TYP för raden (inklusive den extra sökvägskolumnen) och för den resulterande tabellen.
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
och definiera tabellfunktionen genom att hämta markören och lägga till funktionsanropet.
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;
/
Nu kan du välja data från tabellfunktionen
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
och naturligtvis kan du använda den här frågan för att öppna en markör i en tredje funktion som returnerar SYS_REFCURSOR med den extra sökvägskolumnen.