Una posible solución (que eventualmente podría simplificarse) es usar una función de tabla para procesar el cursor y agregar el valor de la función.
Suponga que la función que devuelve el sys_refcursor se llama get_cur
y que el cursor consiste en la columna ID, NAME
(esto es importante, ya que la función de tabla requiere una definición de tipo).
Declara el TIPO para la fila (incluida la columna de ruta adicional) y para la tabla resultante.
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
y defina la función de la tabla recuperando el cursor y agregando la llamada a la función.
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;
/
Ahora puede seleccionar los datos de la función de tabla
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
y, por supuesto, puede usar esta consulta para abrir un cursor en una tercera función que devolverá SYS_REFCURSOR con la columna de ruta adicional.