sql >> Databasteknik >  >> RDS >> Oracle

FORALL-uttalande med INDICES-OF Bound-klausul i Oracle Database

Varför FORALL Statement med INDICES OF Bound-klausul?

FORALL-sats med Lower &Upper Bound-sats är förmodligen det enklaste sättet att bearbeta massdata tills vi refererar till en tät samling. När det gäller sparsam insamling står Lower &Upper Bound-satsen inte starkt. Tyvärr är chanserna att arbeta med tät samling tyvärr mycket lägre i verklighetens scenario än att arbeta med en gles samling.

Hur som helst, om du är nyfiken så har vi gjort en demonstration. Kolla in vad som händer när vi använder Lower &Upper bound-satsen i FORALL-satsen med sparsam samling i videon på vår YouTube-kanal här.

Nackdelen med Lower &Upper bound-satsen i FORALL-satsen är att den inte kan användas med en sparsam samling. Denna brist kan lätt övervinnas genom att använda alternativ som "Index-of ' eller 'Värden-av ’ bunden klausul. Denna handledning handlar om det tidigare alternativet.

INDICES-OF Bound-sats

I likhet med Lower &Upper bound-satsen INDICES-OF-satsen hjälper oss att bearbeta massdata genom att låta oss iterera genom samlingen. Den enda skillnaden är att med INDICES OF-satsen kan vi iterera genom en tät såväl som en sparsam samling. Medan Lower &Upper bound-satsen bara fungerar med en tät samling.

Syntax för INDICES OF bound-sats

FORALL index IN INDICES OF collection_variable
[SAVE EXCEPTION]
DML statements; 

Var:

FÖRALLT är ett reserverat nyckelord i Oracle Database följt av ett Index. Detta index är en implicit definierad loopräknare som deklareras av PL/SQL-motorn. Efter det måste du skriva ett annat nyckelord som är IN. Följt av IN nyckelord har vi vår bundna klausul som är INDICES OF.

Direkt efter att ha skrivit den reserverade frasen "INDICES OF" måste vi specificera samlingsvariabeln för samlingen vars data vi vill använda. Vi vet redan att vi refererade till samlingen i programmet genom dess samlingsvariabel. Därefter har vi alternativet SPARA UNDANTAG, detta är ett valfritt val. Sedan har vi en DML-sats, detta kan vara vilken DML-sats som helst eller en MERGE-sats.

Se till att DML-satsen eller MERGE-satsen du använder med FORALL måste referera till en samling. En FORALL-sats kan också endast behandla en DML- eller en MERGE-sats på en gång.

Exempel på INDICES OF bound-sats

Här kommer vi att se en demonstration av INDICES OF bound-satsen med FORALL-satsen. Här kommer vi att hämta data från en redan initierad gles kapslad tabell och lagra den i en tabell.

Som vi lärde oss i föregående handledning tar FORALL-satsen data från samlingen och lagrar den i en tabell. Därför skapar vi först en tabell.

SET SERVEROUTPUT ON;
CREATE TABLE tut_78(
    mul_tab NUMBER(5)
);

För att göra demonstrationen enkel skapade vi en mycket enkel tabell med namnet tut_78. Den här tabellen har bara en kolumn mul_tab av NUMBER datatyp.

DECLARE
    TYPE my_nested_table IS TABLE OF number;
    var_nt my_nested_table := my_nested_table (9,18,27,36,45,54,63,72,81,90);
    --Another variable for holding total number of record stored into the table 
    tot_rec NUMBER;
BEGIN
    var_nt.DELETE(3, 6);
    
    FORALL idx IN INDICES OF var_nt
        INSERT INTO tut_78 (mul_tab) VALUES (var_nt(idx));
        
    SELECT COUNT (*) INTO tot_rec FROM tut_78;
    DBMS_OUTPUT.PUT_LINE ('Total records inserted are '||tot_rec);
END;
/

Du kan hitta den detaljerade förklaringen av ovanstående kod i videohandledningen. Men låt oss ändå ha en snabb förklaring här också.

Deklarationsavsnittet i ovanstående PL/SQL-block

Här i det här avsnittet skapade vi först en kapslad tabell med namnet "my_nested_table ’. Den innehåller data för NUMBER datatyp. Sedan deklarerade vi dess samlingsvariabel 'var_nt ’. Genom att använda den initierade vi de första 10 indexen genom att lagra 10 numeriska element i vår samling.

Förutom Nested Table och dess samlingsvariabel deklarerade vi också en extra variabel "tot_rec ’ av nummerdatatypen. Denna variabel kommer att användas för att hålla det totala antalet data som kommer att lagras i tabellen.

Utförandesektion

Om du tittar på det första uttalandet i exekveringsavsnittet. Du kommer att upptäcka att genom att använda insamlingsmetoden DELETE har jag raderat data från index 3 till index 6. Detta betyder att indexet för vår samling nu inte fylls i sekventiellt. Det ändrar karaktären på vår kollektion från DENSE till SPARSE.

Direkt efter insamlingsmetoden DELETE-anropet har vi vår FORALL-sats med INDICES OF bound-sats. Med detta uttalande infogar vi i samlingen 'my_nested_table' i tabellen tut_78.

Sedan har vi en SELECT-INTO-sats. Denna sats returnerar det totala antalet rader som infogats i tabellen tut_78 och lagrar det värdet i variabeln tot_rec. Sedan med hjälp av DBMS_OUTPUT-satsen visar vi tillbaka värdet lagrat i variabeln tot_rec med en formaterad sträng för användaren.

Jag rekommenderar starkt att du tittar på den här handledningen på min YouTube-kanal för en djupgående förklaring av den ovan diskuterade koden. Glöm inte heller att prenumerera på kanalen för fler intressanta handledningar.

Tack, det är PL/SQL-handledning om hur man gör bulkdatabearbetning med FORALL-sats med INDICES OF bound-sats. Hoppas du tyckte om att läsa i så fall, dela den här bloggen på dina sociala medier. Ha en bra dag!


  1. 4 funktioner som extraherar mikrosekunder från ett tidsvärde i MariaDB

  2. 3 sätt att hitta rader som innehåller versaler i SQLite

  3. Hur man uppdaterar Array i PostgreSQL

  4. 5 fantastiska resurser som hjälper dig att rocka din databasövervakningsroll