Oracle PL/SQL BULK COLLECT: FORALL Eksempel

Hva er BULK COLLECT?

BULK COLLECT reduserer kontekstbytte mellom SQL og PL/SQL-motor og lar SQL-motoren hente postene pรฅ en gang.

Oracle PL/SQL gir funksjonaliteten til รฅ hente postene i bulk i stedet for รฅ hente รฉn etter รฉn. Denne BULK COLLECT kan brukes i 'SELECT'-setningen for รฅ fylle ut postene i bulk eller for รฅ hente markรธren i bulk. Siden BULK COLLECT henter posten i BULK, bรธr INTO-leddet alltid inneholde en samlingstypevariabel. Den stรธrste fordelen med รฅ bruke BULK COLLECT er at det รธker ytelsen ved รฅ redusere interaksjonen mellom database og PL/SQL-motor.

Syntaks:

SELECT <columnl> BULK COLLECT INTO bulk_varaible FROM <table name>;
FETCH <cursor_name> BULK COLLECT INTO <bulk_varaible >;

I syntaksen ovenfor brukes BULK COLLECT for รฅ samle inn data fra 'SELECT' og 'FETCH'-setningen.

FORALL klausul

FORALL gjรธr det mulig รฅ utfรธre DML-operasjoner pรฅ data i bulk. Det ligner pรฅ FOR loop-setningen bortsett fra i FOR lรธkke ting skjer pรฅ rekordnivรฅ, mens det i FORALL ikke er noe LOOP-konsept. I stedet blir hele dataen som er tilstede i det gitte omrรฅdet behandlet samtidig.

Syntaks:

FORALL <loop_variable>in<lower range> .. <higher range> 

<DML operations>;

I syntaksen ovenfor vil den gitte DML-operasjonen bli utfรธrt for hele dataen som er tilstede mellom lavere og hรธyere omrรฅde.

LIMIT-klausul

Masseinnsamlingskonseptet laster hele dataen inn i mรฅlinnsamlingsvariabelen som en bulk, dvs. at hele dataen vil fylles inn i innsamlingsvariabelen pรฅ รฉn gang. Men dette er ikke tilrรฅdelig nรฅr den totale posten som mรฅ lastes er veldig stor, fordi nรฅr PL / SQL prรธver รฅ laste inn hele dataen, det bruker mer รธktminne. Derfor er det alltid greit รฅ begrense stรธrrelsen pรฅ denne bulkoppsamlingsoperasjonen.

Imidlertid kan denne stรธrrelsesgrensen enkelt oppnรฅs ved รฅ introdusere ROWNUM-betingelsen i 'SELECT'-setningen, mens dette ikke er mulig for markรธren.

For รฅ overvinne dette Oracle har gitt 'LIMIT'-klausul som definerer antall poster som mรฅ inkluderes i massen.

Syntaks:

FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;

I syntaksen ovenfor bruker cursor fetch-setningen BULK COLLECT-setningen sammen med LIMIT-leddet.

BULK COLLECT-attributter

Lik markรธr attributter BULK COLLECT har %BULK_ROWCOUNT(n) som returnerer antall berรธrte rader i nth DML-setning av FORALL-setningen, dvs. den vil gi antallet poster som er berรธrt i FORALL-setningen for hver enkelt verdi fra samlingsvariabelen. Begrepet 'n' angir verdisekvensen i samlingen som radtellingen er nรธdvendig for.

Eksempel 1: I dette eksemplet vil vi projisere alle ansattes navn fra emp-tabellen ved รฅ bruke BULK COLLECT, og vi skal ogsรฅ รธke lรธnnen til alle ansatte med 5000 ved รฅ bruke FORALL.

BULK COLLECT-attributter

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);
lv_emp_name lv_emp_name_tbl;
BEGIN
OPEN guru99_det;
FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;
FOR c_emp_name IN lv_emp_name.FIRST .. lv_emp_name.LAST
LOOP
Dbms_output.put_line(โ€˜Employee Fetched:โ€˜||c_emp_name);
END LOOP:
FORALL i IN lv_emp_name.FIRST .. lv emp_name.LAST
UPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);
COMMIT;	
Dbms_output.put_line(โ€˜Salary Updatedโ€˜);
CLOSE guru99_det;
END;
/

Produksjon

Employee Fetched:BBB
Employee Fetched:XXX 
Employee Fetched:YYY
Salary Updated

Kodeforklaring:

  • Kodelinje 2: Erklรฆrer markรธren guru99_det for setningen 'SELECT emp_name FROM emp'.
  • Kodelinje 3: Erklรฆrer lv_emp_name_tbl som tabelltype for VARCHAR2(50)
  • Kodelinje 4: Erklรฆrer lv_emp_name som lv_emp_name_tbl type.
  • Kodelinje 6: ร…pne markรธren.
  • Kodelinje 7: Henter markรธren ved รฅ bruke BULK COLLECT med LIMIT-stรธrrelsen som 5000 intl lv_emp_name-variabel.
  • Kodelinje 8-11: Sette opp FOR loop for รฅ skrive ut all posten i samlingen lv_emp_name.
  • Kodelinje 12: Ved รฅ bruke FORALL oppdaterer lรธnnen til alle ansatte med 5000.
  • Kodelinje 14: Forplikter transaksjonen.

Oppsummer dette innlegget med: