sql >> Database >  >> RDS >> Oracle

Inleiding tot FORALL-instructie in Oracle Database

Bulkgegevensverwerking met FORALL-verklaring

Ik weet dat de vorige tutorial een korte onderbreking was van onze Bulk Collect-serie. Het was tenslotte de vraag van het publiek en we hadden de plicht om hieraan te voldoen. Maar maak je geen zorgen, we zijn weer op de goede weg. Laten we dus eens kijken naar de inleiding tot bulkgegevensverwerking met behulp van de FORALL-instructie in Oracle Database.

Als je niet weet over welke tutorial ik het heb, kijk dan hier. Laten we nu naar het onderwerp gaan.

Wat is een FORALL-verklaring?

FORALL-instructie helpt om bulkgegevens op een geoptimaliseerde manier te verwerken door DML-instructies of een MERGE-instructie (als u 11g of hoger gebruikt) in batches van PL/SQL-engine naar SQL-engine te verzenden.

U kunt een FORALL-instructie ook definiëren als een bulklusconstructie die een DML-instructie of een MERGE-instructie één keer of meerdere keren tegelijk uitvoert.

Bulk collect optimaliseert de query en verbetert de prestaties door de contextwisselingen te verminderen. FORALL doet hetzelfde voor DML-statements zoals Insert, Delete, Update of voor een MERGE-statement.

Wat is de syntaxis van de FORALL-instructie?

De syntaxis is vrij eenvoudig, laten we eens kijken.

FORALL index IN bound_clauses 
[SAVE EXCEPTION]
DML statement;

Waar:

FORALL is het door Oracle gereserveerde trefwoord.

Index is een impliciet gedefinieerde lusteller die door de PL/SQL-engine wordt gedeclareerd als PLS_INTEGER. Omdat het impliciet wordt gedefinieerd door de PL/SQL-engine, hoeft u het dus niet te definiëren. De reikwijdte van de Index is beperkt tot de FORALL-instructie waarin deze is gedefinieerd.

Bound_Clauses zijn de clausules die het aantal lusiteraties bepalen. Ook de waarde van de index is er ook van afhankelijk. Er zijn drie soorten gebonden clausules in Oracle PL/SQL die we later in deze tutorial afzonderlijk zullen bespreken.

UITZONDERING OPSLAAN is een optionele keuze die ervoor zorgt dat de FORALL-instructie actief blijft, zelfs wanneer de DML-instructie een uitzondering veroorzaakt. Deze uitzonderingen worden opgeslagen in een cursorattribuut genaamd SQL%Bulk_Exceptions.

Info:
Vanwege SAVE EXCEPTION wordt de FORALL-instructie niet abrupt afgesloten, zelfs niet als er een uitzondering is. Dit is een voordeel van het FORALL-statement ten opzichte van FOR Loop.

DML-verklaring :DML-instructie kan elke DML-instructie zijn, zoals INSERT, UPDATE of DELETE. Als u Oracle 11g of hoger gebruikt, kunt u ook de MERGE-instructie gebruiken met FORALL. Maar u moet ervoor zorgen dat uw DML-instructie of de MERGE-instructie moet verwijzen naar ten minste één verzameling in de VALUES- of WHERE-clausule.

Bovendien kunnen we, in tegenstelling tot FOR Loop, met de FORALL-instructie slechts één DML tegelijk gebruiken. Dit is de tekortkoming van FORALL.

Is FORALL een loop zoals FOR Loop?

Nee, hoewel de FORALL-instructie door alle rijen van een verzameling loopt, maar het is geen FOR-lus. Als je de syntaxis goed hebt bekeken, moet je hebben opgemerkt dat in tegenstelling tot 'FOR Loop' het blok van de FORALL-instructie niet begint met het trefwoord LOOP en ook niet eindigt met het trefwoord END LOOP.

Kunnen we DML invoegen en bijwerken tegelijk uitvoeren met FORALL?

Nee, helaas kunnen we in tegenstelling tot FOR Loop met FORALL niet meer dan één DML tegelijk uitvoeren. Dit betekent dat u Insert of Update tegelijk kunt uitvoeren, niet beide tegelijk. Dat is een tekortkoming van de FORALL-verklaring.

Wat is cursorattribuut SQL%Bulk_Exceptions?

Het cursorattribuut SQL%Bulk_Exceptions is een verzameling records met twee velden Error_Index en Error_Code. Error_Index slaat het aantal iteraties van de FORALL-instructie op waarin de uitzondering is opgetreden. Aan de andere kant slaat Error_Code de uitzonderingscode op die overeenkomt met de verhoogde uitzondering.

Kunnen we het aantal uitzonderingen zien dat is opgetreden tijdens de uitvoering van de FORALL-instructie?

Met SQL%BULK_EXCEPTION.COUNT kunt u eenvoudig controleren hoeveel uitzonderingen er zijn opgetreden tijdens de uitvoering van de FORALL-instructie.

Wat zijn die gebonden clausules? Vertel ons iets over hen.

Zoals hierboven vermeld, bepalen Bound-clausules de waarde van de lusindex en het aantal herhalingen van de FORALL-instructie. Er zijn drie soorten gebonden clausules die kunnen worden gebruikt met de FORALL-instructie in Oracle Database. Dit zijn:

  1. Onder- en bovengrens
  2. Indices van en
  3. Waarden van

De ONDER- EN BOVENgrens :Net als bij FOR LOOP, moet u in deze gebonden clausule het geldige begin en het einde van de opeenvolgende indexnummers van de verzameling waarnaar wordt verwezen, specificeren.

Het is een must om een ​​geldig bereik van opeenvolgende indexnummers op te geven samen met deze gebonden clausule voor het aantal collectie(s) waarnaar wordt verwezen in de DML-instructie. Er bestaat echter een kans op fouten als de verzameling waarnaar met deze clausule wordt verwezen, schaars blijkt te zijn. De fout die u krijgt is deze:

ORA-22160: element at index [3] does not exist

Als uw verzameling waarnaar wordt verwezen schaars is en u Oracle 10g of hoger gebruikt, wilt u misschien de andere twee opties gebruiken, namelijk 'Indices-of' en 'Values-of'.

De INDICES VAN :De tweede gebonden clausule die voor ons beschikbaar is, is 'Indices van'. Met deze gebonden clausule kan onze FORALL-instructie door een schaarse verzameling lopen, zoals een associatieve array of een geneste tabel.

Voorgestelde lezing:Inleiding tot PL/SQL-verzameling

De WAARDEN VAN :De derde gebonden clausule is Waarden van. De optie VALUES OF maakt duidelijk dat de waarden van de elementen van de opgegeven verzameling van de lusteller de basis vormen van de waarden in het FORALL-statement. Kortom, deze verzameling is een groep indexen waar de FORALL-instructie doorheen kan lopen. Bovendien hoeven deze indexen niet uniek te zijn en kunnen ze in willekeurige volgorde worden weergegeven.

Als je sneller leert door video-tutorials te bekijken, dan is hier een die de FORALL-verklaring in detail uitlegt.

We zullen in de toekomstige tutorials leren hoe we al deze gebonden clausules met FORALL-instructie kunnen gebruiken, dus houd ons in de gaten. Voor de laatste update kun je je abonneren op mijn YouTube-kanaal en me volgen op mijn sociale media.

Bedankt en een fijne dag verder!


  1. URL-tekenreeksindeling voor verbinding met Oracle-database met JDBC

  2. oracle PL/SQL hoe bereik ip te berekenen voor IPv6 cidr

  3. Wat is het doel van systeemtabel master..spt_values ​​en wat is de betekenis van de waarden?

  4. Hoe de status van de PostgreSQL-server Mac OS X te controleren