sql >> Database teknologi >  >> RDS >> Oracle

Introduktion til FORALL-erklæring i Oracle-databasen

Massdatabehandling ved hjælp af FORALL-erklæring

Jeg ved, at den forrige tutorial var en hurtig pause fra vores Bulk Collect-serie. Det var trods alt det, publikum efterspurgte, og vi havde en forpligtelse til at opfylde det. Men bare rolig, vi er tilbage på sporet. Så lad os se introduktionen til massedatabehandling ved hjælp af FORALL-sætning i Oracle Database.

Hvis du ikke ved, hvilken tutorial jeg taler om, så tjek her. Så lad os nu komme til emnet.

Hvad er en FORALL-erklæring?

FORALL-sætning hjælper med at behandle bulkdata på en optimeret måde ved at sende DML-sætninger eller en MERGE-sætning (hvis du bruger 11g eller derover) i batches fra PL/SQL-motor til SQL-motor.

Du kan også definere en FORALL-sætning som en bulk-loop-konstruktion, der udfører DML-sætning eller en MERGE-sætning én eller flere gange på én gang.

Masseindsamling optimerer forespørgslen og øger ydeevnen ved at reducere kontekstskiftene. FORALL gør det samme for DML-sætninger som Insert, Delete, Update eller for en MERGE-sætning.

Hvad er syntaksen for FORALL-sætningen?

Syntaksen er ret enkel, lad os tage et kig.

FORALL index IN bound_clauses 
[SAVE EXCEPTION]
DML statement;

Hvor:

FORALL er Oracle Reserved Keyword.

Indeks er en implicit defineret loop-tæller, som er erklæret af PL/SQL-motoren som PLS_INTEGER. Da det er implicit defineret af PL/SQL-motoren, behøver du derfor ikke at definere det. Indeksets omfang er begrænset til FORALL-sætningen, hvori det er defineret.

Bound_Clausules er de klausuler, der styrer antallet af loop-iterationer. Også værdien af ​​indekset er også afhængig af det. Der er tre typer bundne klausuler i Oracle PL/SQL, som vi vil diskutere separat senere i denne øvelse.

GEM UNDTAGELSE er et valgfrit valg, som holder FORALL-sætningen kørende, selv når DML-sætningen forårsager en undtagelse. Disse undtagelser gemmes i en markørattribut kaldet SQL%Bulk_Exceptions.

Oplysninger:
På grund af SAVE EXCEPTION afsluttes FORALL-sætningen ikke brat, selv når der er en undtagelse. Dette er en fordel ved FORALL statement frem for FOR Loop.

DML-erklæring :DML-sætning kan være en hvilken som helst DML-sætning som INSERT, UPDATE eller DELETE. Hvis du bruger Oracle 11g eller derover, kan du også bruge MERGE-sætning med FORALL. Men du skal sørge for, at din DML-sætning eller MERGE-sætningen skal referere til mindst én samling i dens VALUES- eller WHERE-sætning.

I modsætning til FOR Loop kan vi med FORALL-sætning kun bruge én DML ad gangen. Dette er mangelen ved FORALL.

Er FORALL en loop som FOR Loop?

Nej, selvom FORALL-sætningen gentager alle rækkerne i en samling, men det er ikke en FOR-løkke. Hvis du har set syntaksen omhyggeligt, så må du have bemærket, at i modsætning til 'FOR Loop' starter blokken af ​​FORALL-sætningen hverken med nøgleordet LOOP eller slutter med nøgleordet END LOOP.

Kan vi udføre Indsæt og Opdater DML på én gang ved hjælp af FORALL?

Nej, desværre I modsætning til FOR Loop med FORALL kan vi ikke udføre mere end én DML ad gangen. Dette betyder, at du enten kan udføre Indsæt eller Opdater ad gangen, ikke begge sammen. Det er en mangel ved FORALL-erklæringen.

Hvad er markørattributten SQL%Bulk_Exceptions?

Markørattributten SQL%Bulk_Exceptions er en samling poster, som har to felter Error_Index og Error_Code. Error_Index gemmer antallet af iterationer af FORALL-sætningen, hvori undtagelsen er opstået. På den anden side gemmer Error_Code den undtagelseskode, der svarer til den rejste undtagelse.

Kan vi se antallet af undtagelser, der er opstået under udførelsen af ​​FORALL-sætningen?

Du kan nemt kontrollere, hvor mange undtagelser der er blevet rejst under udførelsen af ​​FORALL-sætningen ved hjælp af SQL%BULK_EXCEPTION.COUNT.

Hvad er de bundne klausuler? Fortæl os noget om dem.

Som nævnt ovenfor styrer Bound-sætninger værdien af ​​loop-indeks og antallet af iterationer af FORALL-sætningen. Der er tre typer bundne klausuler, som kan bruges med FORALL-sætningen i Oracle Database. Disse er:

  1. Nedre og øvre grænse
  2. Indeks for og
  3. Værdier af

NEDRE OG ØVRE grænse :I lighed med FOR LOOP skal du i denne bundne klausul angive den gyldige start og slutning af de fortløbende indeksnumre for den refererede samling.

Det er et must at specificere et gyldigt interval af på hinanden følgende indeksnumre sammen med denne bundne klausul for antallet af samling(er), der refereres til i DML-sætningen. Der er dog en risiko for fejl, hvis samlingen, der henvises til med denne klausul, viser sig at være sparsom. Fejlen du får er denne:

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

I tilfælde af at din refererede samling er sparsom, og du bruger Oracle 10g eller derover, vil du måske bruge de to andre muligheder, som er 'Indices-of' og 'Values-of'.

INDICES FOR :Den anden bundne klausul, som er tilgængelig for os, er 'indekser for'. Denne bundne klausul gør det muligt for vores FORALL-sætning at gå gennem en sparsom samling, såsom en associativ matrix eller en indlejret tabel.

Foreslået læsning:Introduktion til PL/SQL-samling

VÆRDIERNE AF :Den tredje bundne klausul er Værdier af. Valgmuligheden VALUES OF gør det klart, at værdierne af elementerne i den angivne samling af loop-tælleren er grundlaget for værdierne i FORALL-sætningen. Grundlæggende er denne samling en gruppe af indekser, som FORALL-sætningen kan gå igennem. Ydermere behøver disse indekser ikke at være unikke, ligesom de kan opføres i en vilkårlig rækkefølge.

Hvis du lærer hurtigere ved at se video-tutorial, så er her en forklarende FORALL-erklæring i detaljer.

Vi vil lære, hvordan man bruger alle disse bundne klausuler med FORALL-sætningen i fremtidige selvstudier, så følg med. For seneste opdatering kan du abonnere på min YouTube-kanal og følge mig på mine sociale medier.

Tak og god dag!


  1. SQLite - Opdater data

  2. Formater SQLite-forespørgselsresultater som en kommasepareret liste

  3. Almindelige ER-diagramfejl

  4. Hvordan kan jeg træde ind i en SQL Server-lagret proc fra min C#-kode?