Oracle PL/SQL BULK COLLECT: FORALL Esimerkki
โก รlykรคs yhteenveto
NOUDATA IRTOMรรRรNร Oracle PL/SQL hakee useita rivejรค kerralla kokoelmaan, kun taas FORALL lรคhettรครค massa-DML:รครค takaisin tietokantaan. Molemmat poistavat kontekstivaihdot SQL- ja PL/SQL-moottorien vรคlillรค, mikรค parantaa suorituskykyรค.

Mikรค on BULK COLLECT?
JOUKKOKERUUS vรคhentรครค kontekstinvaihtoja SQL ja PL/SQL-moottori ja sallii SQL-moottorin hakea tietueet kerralla.
Oracle PL / SQL tarjoaa toiminnallisuuden tietueiden joukkonousuun yksitellen noutamisen sijaan. Tรคtรค BULK COLLECT -kรคskyรค voidaan kรคyttรครค SELECT-lausekkeessa tietueiden joukkonousuun tai tietueen noutamiseen. kohdistin irtotavarana. Koska BULK COLLECT noutaa tietueet irtotavarana, INTO-lausekkeen tulisi aina sisรคltรครค kokoelmatyyppinen muuttuja. BULK COLLECTin kรคytรถn tรคrkein etu on, ettรค se parantaa suorituskykyรค vรคhentรคmรคllรค tietokannan ja PL/SQL-moottorin vรคlistรค vuorovaikutusta.
Syntaksi:
SELECT <column1> BULK COLLECT INTO bulk_variable FROM <table name>; FETCH <cursor_name> BULK COLLECT INTO <bulk_variable>;
Yllรค olevassa syntaksissa BULK COLLECT -funktiota kรคytetรครคn tietojen kerรครคmiseen SELECT- ja FETCH-lausekkeista.
FORALL-lauseke
FORALL-lauseke suorittaa DML-toiminnot massadatalle. Se muistuttaa FOR-silmukkalauseketta, paitsi ettรค FOR-silmukassa toiminnot tapahtuvat tietuetasolla, kun taas FORALLissa ei ole LOOP-kรคsitettรค. Sen sijaan kaikki annetulla alueella olevat tiedot kรคsitellรครคn samanaikaisesti.
Syntaksi:
FORALL <loop_variable> in <lower range> .. <higher range>
<DML operations>;
Yllรค olevassa syntaksissa annettu DML-operaatio suoritetaan koko datalle, joka on alemman ja ylemmรคn alueen vรคlillรค.
LIMIT-lauseke
Joukkokerรคyskonsepti lataa kaikki tiedot kohdekokoelmamuuttujaan kerralla, eli kaikki tiedot tรคytetรครคn kokoelmamuuttujaan kerralla. Tรคmรค ei kuitenkaan ole suositeltavaa, jos ladattavien tietueiden kokonaismรครคrรค on erittรคin suuri, koska PL/SQL kuluttaa enemmรคn istuntomuistia yrittรคessรครคn ladata kaikki tiedot. Siksi on aina hyvรค rajoittaa tรคmรคn joukkokerรคysoperaation kokoa.
Tรคmรค kokorajoitus voidaan helposti saavuttaa lisรครคmรคllรค ROWNUM-ehto SELECT-lausekkeeseen, kun taas kohdistimen tapauksessa tรคmรค ei ole mahdollista.
Tรคmรคn voittamiseksi, Oracle on tarjonnut LIMIT-lausekkeen, joka mรครคrittรครค joukkoon sisรคllytettรคvien tietueiden mรครคrรคn.
Syntaksi:
FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;
Yllรค olevassa syntaksissa kohdistimen noutolauseke kรคyttรครค BULK COLLECT -lauseketta yhdessรค LIMIT-lauseen kanssa.
BULK COLLECT Ominaisuudet
Samoin kuin kohdistimen attribuuttien, BULK COLLECT -funktion %BULK_ROWCOUNT(n) palauttaa FORALL-lausekkeen n:nnen DML-lausekkeen vaikuttamien rivien lukumรครคrรคn. Tรคmรค tarkoittaa, ettรค se antaa FORALL-lausekkeen vaikuttamien tietueiden lukumรครคrรคn jokaiselle kokoelmamuuttujan yksittรคiselle arvolle. Termi 'n' osoittaa sen arvon jรคrjestyksen kokoelmassa, jolta rivien lukumรครคrรครค tarvitaan.
Esimerkki 1: Tรคssรค esimerkissรค projisoimme kaikkien tyรถntekijรถiden nimet emp-taulukosta kรคyttรคmรคllรค BULK COLLECT -metodia ja korotamme myรถs kaikkien tyรถntekijรถiden palkkoja 5000:lla kรคyttรคmรคllรค FORALL-metodia.
Alla oleva kuvakaappaus nรคyttรครค tรคmรคn BULK COLLECT- ja FORALL-esimerkin sekรค sen tulosteen 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; /
ulostulo
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Salary Updated
Code Selitys:
- Code rivi 2: Kohdistimen guru99_det mรครคrittely lausekkeelle 'SELECT emp_name FROM emp'.
- Code rivi 3: Taulukon lv_emp_name_tbl mรครคrittรคminen VARCHAR2(50)-tyyppiseksi taulukkoksi.
- Code rivi 4: Mรครคritellรครคn lv_emp_name lv_emp_name_tbl-tyypiksi.
- Code rivi 6: Kursorin avaaminen.
- Code rivi 7: Kohdistimen hakeminen BULK COLLECT -komennolla, jonka LIMIT-kooksi on asetettu 5000, lv_emp_name-muuttujaan.
- Code rivi 8โ11: FOR-silmukan asettaminen tulostamaan kaikki lv_emp_name-kokoelman tietueet.
- Code rivi 12: FORALL-funktion kรคyttรถ kaikkien tyรถntekijรถiden palkkojen pรคivittรคmiseen 5000:lla.
- Code rivi 14: Sitoutuminen kauppa.

