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