Oracle PL/SQL BULK COLLECT: FORALL Primjer
โก Pametni saลพetak
VELIKO PRIKUPLJANJE u Oracle PL/SQL dohvaฤa viลกe redaka odjednom u kolekciju, dok FORALL vraฤa skupni DML natrag u bazu podataka. Oba cut contexta prebacuju se izmeฤu SQL i PL/SQL mehanizama, poveฤavajuฤi performanse.

ล to je BULK COLLECT?
SKUPNO PRIKUPLJANJE smanjuje promjene konteksta izmeฤu SQL i PL/SQL mehanizam te omoguฤuje SQL mehanizmu da odjednom dohvati zapise.
Oracle PL / SQL pruลพa funkcionalnost skupnog dohvaฤanja zapisa umjesto pojedinaฤnog dohvaฤanja. Ova naredba BULK COLLECT moลพe se koristiti u naredbi SELECT za skupno popunjavanje zapisa ili za dohvaฤanje pokazivaฤ skupno. Buduฤi da BULK COLLECT dohvaฤa zapise skupno, klauzula INTO uvijek treba sadrลพavati varijablu tipa kolekcije. Glavna prednost koriลกtenja BULK COLLECT je poveฤanje performansi smanjenjem interakcije izmeฤu baze podataka i PL/SQL mehanizma.
Sintaksa:
SELECT <column1> BULK COLLECT INTO bulk_variable FROM <table name>; FETCH <cursor_name> BULK COLLECT INTO <bulk_variable>;
U gornjoj sintaksi, BULK COLLECT se koristi za prikupljanje podataka iz naredbi SELECT i FETCH.
FORALL klauzula
Naredba FORALL izvrลกava DML operacije na podacima u skupu. Podsjeฤa na naredbu FOR petlje, osim ลกto se u FOR petlji radnje dogaฤaju na razini zapisa, dok u FORALL-u nema koncepta LOOP-a. Umjesto toga, svi podaci prisutni u zadanom rasponu obraฤuju se istovremeno.
Sintaksa:
FORALL <loop_variable> in <lower range> .. <higher range>
<DML operations>;
U gornjoj sintaksi, zadana DML operacija ฤe se izvrลกiti za sve podatke koji se nalaze izmeฤu donjeg i gornjeg raspona.
LIMIT klauzula
Koncept skupnog prikupljanja uฤitava sve podatke u ciljnu varijablu kolekcije kao skupno, tj. svi podaci ฤe se popuniti u varijablu kolekcije odjednom. Ali to se ne preporuฤuje kada je ukupan broj zapisa koje treba uฤitati vrlo velik, jer kada PL/SQL pokuลกa uฤitati sve podatke, troลกi viลกe memorije sesije. Stoga je uvijek dobro ograniฤiti veliฤinu ove operacije skupnog prikupljanja.
Ovo ograniฤenje veliฤine moลพe se lako postiฤi uvoฤenjem uvjeta ROWNUM u SELECT naredbu, dok u sluฤaju kursora to nije moguฤe.
Da bi se ovo prevladalo, Oracle je osigurao klauzulu LIMIT koja definira broj zapisa koji trebaju biti ukljuฤeni u skupnu datoteku.
Sintaksa:
FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;
U gornjoj sintaksi, naredba za dohvaฤanje kursora koristi naredbu BULK COLLECT zajedno s klauzulom LIMIT.
BULK COLLECT Atributi
Sliฤno atributima kursora, BULK COLLECT ima %BULK_ROWCOUNT(n) koji vraฤa broj redaka na koje utjeฤe n-ta DML naredba FORALL naredbe, tj. daje broj zapisa na koje utjeฤe FORALL naredba za svaku pojedinaฤnu vrijednost iz varijable kolekcije. Izraz 'n' oznaฤava redoslijed vrijednosti u kolekciji za koji je potreban broj redaka.
Primjer 1: U ovom primjeru, projicirat ฤemo sva imena zaposlenika iz emp tablice koristeฤi BULK COLLECT, a takoฤer ฤemo poveฤati plaฤu svih zaposlenika za 5000 koristeฤi FORALL.
Snimka zaslona u nastavku prikazuje ovaj primjer BULK COLLECT i FORALL zajedno s njegovim izlazom u Oracle.
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 salary=salary+5000 WHERE emp_name=lv_emp_name(i); COMMIT; Dbms_output.put_line('Salary Updated'); CLOSE guru99_det; END; /
Izlaz
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Salary Updated
Code Objaลกnjenje:
- Code redak 2: Deklarisanje kursora guru99_det za naredbu 'SELECT emp_name FROM emp'.
- Code redak 3: Deklarisanje lv_emp_name_tbl kao tipa tablice VARCHAR2(50).
- Code redak 4: Deklariranje lv_emp_name kao tipa lv_emp_name_tbl.
- Code redak 6: Otvaranje kursora.
- Code redak 7: Dohvaฤanje kursora pomoฤu BULK COLLECT naredbe s LIMIT veliฤinom od 5000 u varijablu lv_emp_name.
- Code redak 8-11: Postavljanje FOR petlje za ispis svih zapisa u kolekciji lv_emp_name.
- Code redak 12: Koriลกtenje FORALL-a za aลพuriranje plaฤa svih zaposlenika za 5000.
- Code redak 14: Poฤinjanje transakcija.

