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: