sql >> Databasteknik >  >> RDS >> Oracle

Introduktion till FORALL-uttalande i Oracle Database

Massdatabehandling med FORALL-utlåtande

Jag vet att den tidigare handledningen var en snabb paus från vår Bulk Collect-serie. Det var trots allt det som krävdes av publiken och vi hade en skyldighet att uppfylla det. Men oroa dig inte, vi är tillbaka på rätt spår. Så låt oss se introduktionen till bulkdatabehandling med FORALL-satsen i Oracle Database.

Om du inte vet vilken handledning jag pratar om, kolla här. Så nu kommer vi till ämnet.

Vad är ett FORALL-påstående?

FORALL-satsen hjälper till att bearbeta bulkdata på ett optimerat sätt genom att skicka DML-satser eller en MERGE-sats (om du använder 11g eller högre) i batcher från PL/SQL-motor till SQL-motor.

Du kan också definiera en FORALL-sats som en bulk-loopkonstruktion som exekverar DML-satsen eller en MERGE-sats en gång eller flera gånger samtidigt.

Massinsamling optimerar frågan och ökar prestandan genom att minska kontextväxlingarna. FORALL gör samma sak för DML-satser som Insert, Delete, Update eller för en MERGE-sats.

Vad är syntaxen för FORALL-satsen?

Syntaxen är ganska enkel, låt oss ta en titt.

FORALL index IN bound_clauses 
[SAVE EXCEPTION]
DML statement;

Var:

FÖRALLT är Oracles reserverade nyckelord.

Index är en implicit definierad loopräknare som deklareras av PL/SQL-motorn som PLS_INTEGER. Eftersom den är implicit definierad av PL/SQL-motorn så behöver du inte definiera den. Indexets omfattning är begränsad till FORALL-satsen där den definieras.

Bound_Clauses är satserna som styr antalet loopiterationer. Även värdet på index är också beroende av det. Det finns tre typer av bundna klausuler i Oracle PL/SQL som vi kommer att diskutera separat senare i denna handledning.

SPARA UNDANTAG är ett valfritt val som håller FORALL-satsen igång även när DML-satsen orsakar ett undantag. Dessa undantag sparas i ett markörattribut som kallas SQL%Bulk_Exceptions.

Information:
På grund av SAVE EXCEPTION avslutas FORALL-satsen inte abrupt även när det finns ett undantag. Detta är en fördel med FORALL-satsen framför FOR Loop.

DML-uttalande :DML-sats kan vara vilken DML-sats som helst som INSERT, UPDATE eller DELETE. Om du använder Oracle 11g eller högre kan du också använda MERGE-satsen med FORALL. Men du måste se till att din DML-sats eller MERGE-satsen måste referera till minst en samling i dess VALUES- eller WHERE-sats.

Dessutom, till skillnad från FOR Loop, kan vi med FORALL-satsen bara använda en DML åt gången. Detta är bristen hos FORALL.

Är FORALL en loop som FOR Loop?

Nej, även om FORALL-satsen itererar genom alla rader i en samling, men det är inte en FOR-loop. Om du har sett syntaxen noggrant måste du ha märkt att till skillnad från "FOR Loop" börjar blocket i FORALL-satsen varken med nyckelordet LOOP eller slutar med nyckelordet END LOOP.

Kan vi köra Insert and Update DML på en gång med FORALL?

Nej, tyvärr Till skillnad från FOR Loop med FORALL kan vi inte köra mer än en DML åt gången. Detta innebär att du antingen kan köra Infoga eller Uppdatera åt gången, inte båda samtidigt. Det är en brist i FORALL-påståendet.

Vad är markörattributet SQL%Bulk_Exceptions?

Markörattributet SQL%Bulk_Exceptions är en samling poster som har två fält Error_Index och Error_Code. Error_Index lagrar antalet iterationer av FORALL-satsen under vilka undantaget har inträffat. Å andra sidan lagrar Error_Code undantagskoden som motsvarar det upphöjda undantaget.

Kan vi se antalet undantag som har inträffat under körningen av FORALL-satsen?

Du kan enkelt kontrollera hur många undantag som har skapats under körningen av FORALL-satsen med SQL%BULK_EXCEPTION.COUNT.

Vad är dessa bundna klausuler? Berätta något om dem.

Som nämnts ovan styr Bound-satser värdet på loopindex och antalet iterationer av FORALL-satsen. Det finns tre typer av bundna satser som kan användas med FORALL-satsen i Oracle Database. Dessa är:

  1. Under och övre gräns
  2. Indeks för och
  3. Värden för

NEDRE OCH ÖVRE gränsen :I likhet med FOR LOOP måste du i den här bundna satsen ange den giltiga början och slutet av de på varandra följande indexnumren för den refererade samlingen.

Det är ett måste att ange ett giltigt intervall av på varandra följande indexnummer tillsammans med denna bundna klausul för antalet samling(er) som refereras till i DML-satsen. Det finns dock en risk för fel om samlingen som hänvisas till med denna klausul visar sig vara gles. Felet som du kommer att få är detta:

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

Om din refererade samling är gles och du använder Oracle 10g eller högre så kanske du vill använda de andra två alternativen som är "Index-of" och "Values-of".

INDICES FÖR :Den andra bundna klausulen som är tillgänglig för oss är 'Index of'. Den här bundna satsen gör det möjligt för vår FORALL-sats att loopa genom en gles samling som en associativ array eller en kapslad tabell.

Föreslagen läsning:Introduktion till PL/SQL-samlingen

VÄRDEN PÅ :Den tredje bundna klausulen är Values ​​of. Alternativet VALUES OF gör det klart att värdena för elementen i den angivna samlingen av loopräknaren är grunden för värdena i FORALL-satsen. I grund och botten är denna samling en grupp av index som FORALL-satsen kan gå igenom. Dessutom behöver dessa index inte vara unika och kan listas i en godtycklig ordning.

Om du lär dig snabbare genom att titta på instruktionsvideo så kommer här ett förklarande FORALL-uttalande i detalj.

Vi kommer att lära oss hur man använder alla dessa bundna klausuler med FORALL-satsen i framtida handledningar så håll utkik. För senaste uppdateringen kan du prenumerera på min YouTube-kanal och följa mig på mina sociala medier.

Tack och ha en bra dag!


  1. Hur kan jag släppa alla tabeller i en PostgreSQL-databas?

  2. Oracle Lås &bordslås:Hur det fungerar

  3. Begränsning av främmande nyckel kan orsaka cykler eller flera kaskadvägar?

  4. Hur skickar jag en lista som en parameter i en lagrad procedur?