Une solution possible (qui pourrait éventuellement être simplifiée) consiste à utiliser une fonction de table pour traiter le curseur et ajouter la valeur de la fonction.
Supposons que la fonction renvoyant le sys_refcursor s'appelle get_cur
et que le curseur se compose de la colonne ID, NAME
(ceci est important, car la fonction de table nécessite une définition de type).
Vous déclarez le TYPE pour la ligne (y compris la colonne de chemin supplémentaire) et pour la table résultante.
create type t_row is object
( id number(10),
name varchar2(10),
path varchar2(10)
);
/
create type t_rows is table of t_row;
/
et définissez la fonction de table récupérant le curseur et ajoutant l'appel de fonction.
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;
/
Vous pouvez maintenant sélectionner les données de la fonction de table
select * from table(get_cur2);
ID NAME PATH
---------- ---------- ----------
1 one path 1
2 two path 2
et bien sûr, vous pouvez utiliser cette requête pour ouvrir un curseur dans une troisième fonction qui renverra le SYS_REFCURSOR avec la colonne de chemin supplémentaire.