Jedním z možných řešení (které by se případně dalo zjednodušit) je použití tabulkové funkce pro zpracování kurzoru a přidání hodnoty funkce.
Předpokládejme, že funkce vracející sys_refcursor se nazývá get_cur
a že se kurzor skládá ze sloupce ID, NAME
(to je důležité, protože tabulková funkce vyžaduje definici typu).
Deklarujete TYPE pro řádek (včetně dalšího sloupce cesty) a pro výslednou tabulku.
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
a definovat tabulkovou funkci načítání kurzoru a přidání volání funkce.
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;
/
Nyní můžete vybrat data z tabulkové funkce
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
a samozřejmě můžete tento dotaz použít k otevření kurzoru ve třetí funkci, která vrátí SYS_REFCURSOR s dodatečným sloupcem cesty.