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

Hvordan skriver jeg en lagret procedure, som tilføjer en kolonne til en ref-markør fra en anden lagret procedure?

En mulig løsning (som i sidste ende kunne forenkles) er at bruge en tabelfunktion til at behandle markøren og tilføje funktionsværdien.

Antag, at funktionen, der returnerer sys_refcursoren, hedder get_cur og at markøren består af kolonne ID, NAME (dette er vigtigt, da tabelfunktionen kræver typedefinition).

Du angiver TYPE for rækken (inklusive den ekstra sti-kolonne) og for den resulterende tabel.

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

create type t_rows is table of t_row;
/

og definere tabelfunktionen ved at hente markøren og tilføje funktionskaldet.

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

Nu kan du vælge data fra tabelfunktionen

select * from  table(get_cur2); 

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

og selvfølgelig kan du bruge denne forespørgsel til at åbne en markør i en tredje funktion, der returnerer SYS_REFCURSOR med den ekstra sti-kolonne.



  1. Er det muligt at udføre en udvælgelse i tabel af objekttype?

  2. Vedvarende login PHP og SQL

  3. json_encode() array i while-løkke for mySQL til kalender

  4. MySQL - alternativer til indlejrede underforespørgsler ved begrænsning af aggregerede data i en korreleret underforespørgsel