sql >> Database >  >> RDS >> Oracle

Hoe schrijf ik een opgeslagen procedure die een kolom toevoegt aan een ref-cursor van een andere opgeslagen procedure?

Een mogelijke oplossing (die uiteindelijk zou kunnen worden vereenvoudigd) is om een ​​tabelfunctie te gebruiken om de cursor te verwerken en de functiewaarde toe te voegen.

Neem aan dat de functie die de sys_refcursor retourneert, get_cur wordt genoemd en dat de cursor bestaat uit kolom ID, NAME (dit is belangrijk, omdat de tabelfunctie typedefinitie vereist).

U declareert het TYPE voor de rij (inclusief de extra padkolom) en voor de 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;
/

en definieer de tabelfunctie door de cursor op te halen en de functieaanroep toe te voegen.

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 kunt u de gegevens uit de tabelfunctie selecteren

select * from  table(get_cur2); 

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

en natuurlijk kunt u deze query gebruiken om een ​​cursor te openen in een derde functie die de SYS_REFCURSOR met de extra padkolom teruggeeft.



  1. Een betere manier om deze json-array te genereren uit MySql-gegevens met php

  2. breek rij_nummer () reeks op basis van vlagvariabele

  3. Een tabel maken met mysql, php en ajax (met jQuery)

  4. Kies uit veel-op-veel vervolgrelaties