Oracle
 sql >> Database >  >> RDS >> Oracle

Come si scrive una stored procedure che aggiunge una colonna a un cursore di riferimento da un'altra stored procedure?

Una possibile soluzione (che potrebbe eventualmente essere semplificata) è utilizzare una funzione tabella per elaborare il cursore e aggiungere il valore della funzione.

Supponiamo che la funzione che restituisce sys_refcursor sia chiamata get_cur e che il cursore sia costituito dalla colonna ID, NAME (questo è importante, poiché la funzione tabella richiede la definizione del tipo).

Dichiari il TIPO per la riga (inclusa la colonna del percorso aggiuntivo) e per la tabella risultante.

create type t_row is object
 ( id             number(10),
   name varchar2(10),
   path varchar2(10)
);
/

create type t_rows is table of t_row;
/

e definire la funzione tabella prelevando il cursore e aggiungendo la chiamata di funzione.

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;
/

Ora puoi selezionare i dati dalla funzione tabella

select * from  table(get_cur2); 

        ID NAME       PATH     
---------- ---------- ----------
         1 one        path 1     
         2 two        path 2 

e ovviamente puoi usare questa query per aprire un cursore in una terza funzione che restituirà SYS_REFCURSOR con la colonna del percorso aggiuntiva.