Едно възможно решение (което евентуално може да бъде опростено) е да се използва таблична функция за обработка на курсора и за добавяне на стойността на функцията.
Да приемем, че функцията, връщаща sys_refcursor, се нарича get_cur
и че курсорът се състои от колона ID, NAME
(това е важно, тъй като табличната функция изисква дефиниране на тип).
Вие декларирате TYPE за реда (включително допълнителната колона на пътя) и за получената таблица.
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
и дефинирайте табличната функция, която извлича курсора и добавя извикването на функцията.
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;
/
Сега можете да изберете данните от табличната функция
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
и, разбира се, можете да използвате тази заявка, за да отворите курсор в трета функция, която ще върне SYS_REFCURSOR с допълнителната колона за път.