Oracle Bulk collect

En kollega hadde et problem med en pl/sql blokk. Hun ønsket å gjøre en bulk collect inn i en array av records. Det er svært vanlig å tenke på denne måten, men dette fungerer ikke med hensyn til bulk collect. Her må vi i stedet snu ting litt på hodet (se beskrivelse under).

Vedkommende ønsket å gjøre noe tilsvarende:

declare
   TYPE rec IS RECORD (
        nr       t1.nr%TYPE,
        a_gruppe t1.gruppe_nr1%TYPE,
        b_gruppe t1.gruppe_nr2%TYPE,
        c_gruppe char(1));

   TYPE tab IS TABLE OF AutRec; 

   t_tab tab;
   l_array_size  number default 1000;

   l_done        boolean;

   cursor c1 is 
        select nr, gruppe_nr1, gruppe_nr2,
                    case when gruppe_nr1=1 or gruppe_nr2=5 then 'A'
                             when gruppe_nr1=15 or gruppe_nr2=15 then 'B'
                             else 'C'
                    end gruppe_kat
       from t1 where code in (5);

 begin

   open c1;
   loop
       fetch c1 bulk collect  into
                 t_tab.nr, t_tab.a_gruppe, t_tab.b_gruppe, t_tab.c_gruppe
                 limit l_array_size;

...

end;
/

Denne feilen har jeg selv gjort et par ganger. Det er ofte sånn vi tenker: Først lager vi et object (dvs en record eller type), så lager vi en tabell (array) bestående av denne typen. MEN … når det gjelder bulk collect gjelder følgende regel:

Man kan ikke gjøre bulk collect inn i en array av records, men du kan inn i en record of arrays.

Vi kan dermed skrive om koden til følgende:

declare
   TYPE rec IS RECORD (
        nr       dbms_sql.number_table,
        a_gruppe dbms_sql.number_table,
        b_gruppe dbms_sql.number_table,
        c_gruppe dbms_sql.varchar2_table);

   t_rec rec;
   l_array_size  number default 1000;

   l_done        boolean;

   cursor c1 is
        select nr, gruppe_nr1, gruppe_nr2,
                    case when gruppe_nr1=1 or gruppe_nr2=5 then 'A'
                             when gruppe_nr1=15 or gruppe_nr2=15 then 'B'
                             else 'C'
                    end gruppe_kat
       from t1 where code in (5);

 begin

   open c1;
   loop
       fetch c1 bulk collect  into
                 t_rec.nr, t_rec.a_gruppe, t_rec.b_gruppe, t_rec.c_gruppe
                 limit l_array_size;

...

end;
/

Post a Comment

Your email is never published nor shared. Required fields are marked *