Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie schreibe ich eine gespeicherte Prozedur, die einem Ref-Cursor aus einer anderen gespeicherten Prozedur eine Spalte hinzufügt?

Eine mögliche Lösung (die eventuell vereinfacht werden könnte) besteht darin, eine Tabellenfunktion zu verwenden, um den Cursor zu verarbeiten und den Funktionswert hinzuzufügen.

Angenommen, die Funktion, die den sys_refcursor zurückgibt, heißt get_cur und dass der Cursor aus der Spalte ID, NAME besteht (Dies ist wichtig, da die Tabellenfunktion eine Typdefinition erfordert).

Sie deklarieren den TYP für die Zeile (einschließlich der zusätzlichen Pfadspalte) und für die resultierende Tabelle.

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

create type t_rows is table of t_row;
/

und definieren Sie die Tabellenfunktion, die den Cursor holt und den Funktionsaufruf hinzufügt.

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

Nun können Sie die Daten aus der Tabellenfunktion auswählen

select * from  table(get_cur2); 

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

und natürlich können Sie diese Abfrage verwenden, um einen Cursor in einer dritten Funktion zu öffnen, die den SYS_REFCURSOR mit der zusätzlichen Pfadspalte zurückgibt.