Oracle PL/SQL BULK COLLECT: FORALL Voorbeeld

โšก Slimme samenvatting

GROOTVERZAMELEN in Oracle PL/SQL haalt veel rijen tegelijk op in een collectie, terwijl FORALL bulk-DML-bewerkingen terugstuurt naar de database. Beide verminderen het aantal contextwisselingen tussen de SQL- en PL/SQL-engines, wat de prestaties verbetert.

  • ???? GROOTHANDELSVERZAMELING: Haalt meerdere rijen in รฉรฉn keer op in een verzamelingsvariabele, ter vervanging van het trage ophalen van rijen afzonderlijk.
  • ๐Ÿ” VOOR ALGEMEEN: Voert รฉรฉn INSERT-, UPDATE- of DELETE-bewerking uit op een volledige verzameling met รฉรฉn enkele contextwissel.
  • ๐Ÿ“ LIMIT-clausule: Beperkt het aantal rijen dat elke BULK COLLECT-ophaling laadt, waardoor het sessiegeheugen bij grote tabellen wordt beschermd.
  • ๐Ÿ“Š BULK COLLECTIE-attributen: Het attribuut %BULK_ROWCOUNT(n) geeft aan hoeveel rijen de n-de FORALL DML-instructie heeft beรฏnvloed.
  • โš™๏ธ Vereiste collecties: De INTO-clausule moet betrekking hebben op een verzamelingstype, zoals een geneste tabel of een associatieve array.
  • ๐Ÿค– AI-assistentie: AI-assistenten zoals GitHub Copilot stellen BULK COLLECT- en FORALL-blokken op en signaleren een ontbrekende LIMIT-clausule.

Oracle Overzicht van PL/SQL BULK COLLECT en FORALL met LIMIT-clausule

Wat is BULK COLLECT?

BULK COLLECT vermindert contextwisselingen tussen de SQL en een PL/SQL-engine, waardoor de SQL-engine de records in รฉรฉn keer kan ophalen.

Oracle PL / SQL Deze functie biedt de mogelijkheid om records in bulk op te halen in plaats van รฉรฉn voor รฉรฉn. BULK COLLECT kan worden gebruikt in een SELECT-statement om records in bulk te vullen of om een โ€‹โ€‹lijst met records op te halen. cursor In bulk. Omdat BULK COLLECT de records in bulk ophaalt, moet de INTO-clausule altijd een variabele van het type 'collectie' bevatten. Het belangrijkste voordeel van het gebruik van BULK COLLECT is dat het de prestaties verbetert door de interactie tussen de database en de PL/SQL-engine te verminderen.

Syntax:

SELECT <column1> BULK COLLECT INTO bulk_variable FROM <table name>;
FETCH <cursor_name> BULK COLLECT INTO <bulk_variable>;

In de bovenstaande syntaxis wordt BULK COLLECT gebruikt om de gegevens uit de SELECT- en FETCH-instructies te verzamelen.

FORALL-clausule

De FORALL-instructie voert de volgende taken uit: DML-bewerkingen Bij het verwerken van grote hoeveelheden data. Het lijkt op een FOR-lus, met dit verschil dat acties in een FOR-lus op recordniveau plaatsvinden, terwijl er in FORALL geen lusconcept is. In plaats daarvan wordt alle data binnen het opgegeven bereik tegelijkertijd verwerkt.

Syntax:

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

<DML operations>;

In de bovenstaande syntax wordt de opgegeven DML-bewerking uitgevoerd voor alle gegevens die zich binnen het bereik van de onder- en bovengrens bevinden.

LIMIT-clausule

Het bulkcollectieconcept laadt alle gegevens in รฉรฉn keer in de doelcollectievariabele, oftewel alle gegevens worden in รฉรฉn keer in de collectievariabele geladen. Dit is echter niet aan te raden wanneer het totale aantal te laden records erg groot is, omdat PL/SQL dan meer sessiegeheugen verbruikt. Daarom is het altijd verstandig om de omvang van deze bulkcollectiebewerking te beperken.

Deze groottelimiet kan eenvoudig worden bereikt door de ROWNUM-voorwaarde in de SELECT-instructie op te nemen, terwijl dit in het geval van een cursor niet mogelijk is.

Om dit te overwinnen, Oracle heeft de LIMIT-clausule toegevoegd, die het aantal records definieert dat in de bulkverwerking moet worden opgenomen.

Syntax:

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

In de bovenstaande syntaxis gebruikt de cursor fetch-instructie de BULK COLLECT-instructie samen met de LIMIT-clausule.

BULK COLLECT-attributen

Net als cursorattributen heeft BULK COLLECT de parameter %BULK_ROWCOUNT(n), die het aantal rijen retourneert dat wordt beรฏnvloed in de n-de DML-instructie van de FORALL-instructie. Dit betekent dat het aantal records wordt geteld dat wordt beรฏnvloed in de FORALL-instructie voor elke afzonderlijke waarde uit de verzamelingsvariabele. De term 'n' geeft de volgorde aan van de waarde in de verzameling waarvoor het aantal rijen nodig is.

Voorbeeld 1: In dit voorbeeld projecteren we alle werknemersnamen uit de tabel 'emp' met behulp van BULK COLLECT, en verhogen we tevens het salaris van alle werknemers met 5000 met behulp van FORALL.

De onderstaande schermafbeelding toont dit BULK COLLECT- en FORALL-voorbeeld, samen met de bijbehorende uitvoer. Oracle.

BULKVERZAMELING met LIMIET en VOORALLEN voorbeeld: salaris van werknemers bijwerken in 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;
/

uitgang

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

Code Uitleg:

  • Code lijn 2: De cursor guru99_det wordt gedeclareerd voor de instructie 'SELECT emp_name FROM emp'.
  • Code lijn 3: De tabel lv_emp_name_tbl declareren als een tabeltype van VARCHAR2(50).
  • Code lijn 4: Declaratie van lv_emp_name als het type lv_emp_name_tbl.
  • Code lijn 6: De cursor openen.
  • Code lijn 7: De cursor ophalen met BULK COLLECT met een LIMIT-grootte van 5000 in de variabele lv_emp_name.
  • Code regel 8-11: Een FOR-lus instellen om alle records in de collectie lv_emp_name af te drukken.
  • Code lijn 12: De functie FORALL gebruiken om het salaris van alle werknemers met 5000 te verhogen.
  • Code lijn 14: Het vastleggen van de transactie.

Veelgestelde vragen

Nee. Een BULK COLLECT SELECT geeft nooit de foutmelding NO_DATA_FOUND; in plaats daarvan retourneert deze een lege collectie. Test de collectie altijd eerst met de .COUNT-methode voordat u deze leegmaakt.pingAnders kunt u nul rijen stilzwijgend verwerken.

Met SAVE EXCEPTIONS kan FORALL blijven draaien wanneer individuele rijen mislukken. Mislukte rijen worden opgeslagen in SQL%BULK_EXCEPTIONS. Oracle verhoogt ORA-24381, die je in een val zet. uitzondering handler om elke fout te inspecteren.

Gebruik BULK COLLECT wanneer een lus veel rijen leest. cursor Een FOR-lus haalt รฉรฉn rij per switch op, dus bulkophaling in combinatie met FORALL kan bij grote resultatenverzamelingen vele malen sneller werken.

BULK COLLECT retourneert veel rijen tegelijk, dus er is een container voor meerdere rijen nodig. Het INTO-doel moet een Collectie zoals een geneste tabel, VARRAY of associatieve array, en niet een enkele scalaire variabele.

Nee. Een FORALL-header stuurt precies รฉรฉn INSERT-, UPDATE-, DELETE- of MERGE-bewerking aan. Alleen de waarden in de VALUES- en WHERE-clausules kunnen per iteratie wijzigen. Gebruik voor meerdere instructies afzonderlijke FORALL-instructies.

Bulkverwerking kan meerdere malen tot meer dan honderd keer sneller zijn dan code die rij voor rij verwerkt, omdat BULK COLLECT en FORALL duizenden contextwisselingen van de engine samenvoegen tot een paar, waardoor de overhead bij grote hoeveelheden data aanzienlijk wordt verminderd.

Ja. GitHub-copiloot Het document neemt concepten over van BULK COLLECT-ophalingen, FORALL DML-lussen en LIMIT-clausules op basis van een opmerking, en suggereert declaraties van collectietypen, hoewel u de batchgroottes en foutafhandeling zelf moet controleren.

AI-assistenten scannen lussen die rijen รฉรฉn voor รฉรฉn ophalen of wijzigen en adviseren om deze te herschrijven met BULK COLLECT, LIMIT en FORALL. Deze machine learning-review spoort ontbrekende LIMIT-limieten en prestatieknelpunten op vรณรณr de productie.

Vat dit bericht samen met: