Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment écrire une procédure stockée qui ajoute une colonne à un curseur de référence à partir d'une autre procédure stockée ?

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.