En mulig løsning (som i sidste ende kunne forenkles) er at bruge en tabelfunktion til at behandle markøren og tilføje funktionsværdien.
Antag, at funktionen, der returnerer sys_refcursoren, hedder get_cur
og at markøren består af kolonne ID, NAME
(dette er vigtigt, da tabelfunktionen kræver typedefinition).
Du angiver TYPE for rækken (inklusive den ekstra sti-kolonne) og for den resulterende tabel.
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
og definere tabelfunktionen ved at hente markøren og tilføje funktionskaldet.
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ælge data fra tabelfunktionen
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
og selvfølgelig kan du bruge denne forespørgsel til at åbne en markør i en tredje funktion, der returnerer SYS_REFCURSOR med den ekstra sti-kolonne.