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รค.

  • ๐Ÿ“ฆ IRTOKOKOELMA: Noutaa useita rivejรค yhdellรค kertaa kokoelmamuuttujaan korvaten hitaan rivi riviltรค -noudon.
  • ๐Ÿ” KAIKILLE: Suorittaa yhden INSERT-, UPDATE- tai DELETE-komennon koko kokoelmassa yhdellรค kontekstivaihdolla.
  • ๐Ÿ“ LIMIT-lauseke: Rajaa kuinka monta riviรค kukin BULK COLLECT -nouto lataa, suojaten istuntomuistia suurissa taulukoissa.
  • ๐Ÿ“Š BULK COLLECT -ominaisuudet: %BULK_ROWCOUNT(n)-attribuutti kertoo, kuinka moneen riviin n:s FORALL DML -lauseke vaikutti.
  • โš™๏ธ Vaadittavat kokoelmat: INTO-lauseen on kohdistuttava kokoelmatyyppiin, kuten sisรคkkรคiseen taulukkoon tai assosiatiiviseen taulukkoon.
  • ๐Ÿค– AI-apu: Tekoรคlyavustajat, kuten GitHub Copilot, luonnostelevat BULK COLLECT- ja FORALL-lohkoja ja merkitsevรคt puuttuvan LIMIT-lausekkeen.

Oracle PL/SQL BULK COLLECT- ja FORALL-lausekkeiden yleiskatsaus

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.

BULK COLLECT LIMIT- ja FORALL-laskujen avulla, esimerkki tyรถntekijรคn palkan pรคivittรคmisestรค Oracle PL / SQL

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.

UKK

Ei. BULK COLLECT SELECT ei koskaan anna NO_DATA_FOUND-arvoa; sen sijaan se palauttaa tyhjรคn kokoelman. Testaa kokoelma aina .COUNT-metodilla ennen kuin katsotping, muuten saatat kรคsitellรค nolla riviรค รครคnettรถmรคsti.

SAVE EXCEPTIONS -komennon avulla FORALL-funktion voi jatkaa suoritusta yksittรคisten rivien virheen sattuessa. Virheelliset rivit tallennetaan SQL%BULK_EXCEPTIONS-muuttujaan, minkรค jรคlkeen Oracle nostaa ORA-24381:n, jonka ansaitset poikkeus kรคsittelijรค tarkastaa jokaisen virheen.

Kรคytรค BULK COLLECT -funktiota aina, kun silmukka lukee useita rivejรค. kohdistin FOR-silmukka noutaa yhden rivin kytkintรค kohden, joten joukkonouto ja FORALL voivat toimia monta kertaa nopeammin suurilla tulosjoukoilla.

BULK COLLECT palauttaa useita rivejรค kerralla, joten se tarvitsee monirivisen sรคilรถn. INTO-kohteen on oltava kokoelma kuten sisรคkkรคinen taulukko, VARRAY tai assosiatiivinen taulukko, ei yksittรคinen skalaarimuuttuja.

Ei. FORALL-otsake ohjaa tรคsmรคlleen yhtรค INSERT-, UPDATE-, DELETE- tai MERGE-kรคskyรค. Vain sen VALUES- ja WHERE-lauseiden arvot voivat muuttua iteraatiota kohden. Useille lausekkeille kรคytรค erillisiรค FORALL-lausekkeita.

Massakรคsittely voi olla useita kertoja tai jopa yli sata kertaa nopeampaa kuin rivi riviltรค tapahtuva koodin kรคsittely, koska BULK COLLECT ja FORALL kutistavat tuhansia kontekstikytkimiรค muutamaksi, mikรค vรคhentรครค merkittรคvรคsti suurten datamรครคrien kรคsittelyn kustannuksia.

Kyllรค. GitHub Copilot luonnostelee BULK COLLECT -noutoja, FORALL DML -silmukoita ja LIMIT-lauseita kommentista ja ehdottaa kokoelmatyypin mรครคrittelyjรค, vaikka sinun kannattaa tarkistaa erรคkoot ja virheiden kรคsittely itse.

Tekoรคlyavustajat skannaavat silmukoita, jotka hakevat tai muuttavat yhden rivin kerrallaan, ja suosittelevat niiden uudelleenkirjoittamista BULK COLLECT-, LIMIT- ja FORALL-metodeilla. Tรคmรค koneoppimiseen perustuva tarkastelu havaitsee puuttuvat LIMIT-rajoitukset ja suorituskyvyn pullonkaulat ennen tuotantoa.

Tiivistรค tรคmรค viesti seuraavasti: