sql >> Database >  >> RDS >> Oracle

FORALL-verklaring met INDICES-OF Bound-clausule in Oracle Database

Waarom FORALL-verklaring met INDICES OF Bound-clausule?

FORALL-instructie met Lower &Upper Bound-clausule is waarschijnlijk de gemakkelijkste manier om bulkgegevens te verwerken totdat we verwijzen naar een dichte verzameling. Als het gaat om schaarse verzameling, staat de Lower &Upper Bound-clausule niet sterk. Helaas is in het echte leven de kans om met een dichte verzameling te werken veel kleiner dan het werken met een schaarse verzameling.

Hoe dan ook, mocht je nieuwsgierig zijn dan hebben we een demonstratie gedaan. Bekijk wat er gebeurt als we de onder- en bovengrens van de FORALL-instructie met schaarse verzameling gebruiken in de video op ons YouTube-kanaal hier.

De tekortkoming van de onder- en bovengrens van de FORALL-verklaring is dat deze niet kan worden gebruikt met een schaarse verzameling. Deze tekortkoming kan eenvoudig worden verholpen door gebruik te maken van opties zoals 'Indices-of ’ of ‘Waarden van ’ gebonden zin. Deze tutorial gaat helemaal over de eerste optie.

INDICES-OF Bound-clausule

Net als bij de onder- en bovengrensclausule helpt de INDICES-OF-clausule ons bij het verwerken van bulkgegevens door ons door de verzameling te laten lopen. Het enige verschil is dat we met de INDICES OF-clausule zowel een dichte als een schaarse verzameling kunnen doorlopen. Terwijl de onder- en bovengrensclausule alleen werkt met een dichte verzameling.

Syntaxis van INDICES OF gebonden clausule

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

Waar:

FORALL is een door Oracle Database gereserveerd trefwoord gevolgd door een Index. Deze index is een impliciet gedefinieerde lusteller die wordt gedeclareerd door de PL/SQL-engine. Daarna moet je een ander sleutelwoord schrijven dat IN is. Gevolgd door IN-sleutelwoord hebben we onze gebonden clausule die INDICES OF is.

Direct na het schrijven van de gereserveerde zin 'INDICES OF' moeten we de verzamelingsvariabele specificeren van de verzameling waarvan we de gegevens willen gebruiken. We weten al dat we in het programma naar de verzameling hebben verwezen via de verzamelingsvariabele. Gevolgd door dat we de optie OPSLAAN UITZONDERING hebben. Dit is een optionele keuze. Dan hebben we een DML-statement. Dit kan een DML-statement of een MERGE-statement zijn.

Zorg ervoor dat de DML-instructie of de MERGE-instructie die u met FORALL gebruikt, moet verwijzen naar een verzameling. Ook kan een FORALL-instructie slechts één DML- of MERGE-instructie tegelijk verwerken.

Voorbeeld van INDICES OF gebonden clausule

Hier zullen we een demonstratie zien van de INDICES OF gebonden clausule met FORALL-instructie. Hier halen we de gegevens op uit een reeds geïnitialiseerde dun geneste tabel en slaan deze op in een tabel.

Zoals we in de vorige tutorial hebben geleerd, neemt de FORALL-instructie de gegevens uit de verzameling en slaat deze op in een tabel. We zullen dus eerst een tabel maken.

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

Om de demonstratie eenvoudig te houden, hebben we een zeer eenvoudige tabel gemaakt met de naam tut_78. Deze tabel heeft slechts één kolom mul_tab van het gegevenstype NUMBER.

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;
/

De gedetailleerde uitleg van bovenstaande code vind je in de video-tutorial. Maar laten we hier ook een korte uitleg geven.

Declaratiegedeelte van het bovenstaande PL/SQL-blok

Hier in deze sectie hebben we eerst een geneste tabel gemaakt met de naam 'my_nested_table ’. Het bevat de gegevens van het gegevenstype NUMBER. Vervolgens hebben we de verzamelingsvariabele 'var_nt . gedeclareerd ’. Hiermee hebben we de eerste 10 indexen geïnitialiseerd door 10 numerieke elementen in onze verzameling op te slaan.

Naast de geneste tabel en de verzamelingsvariabele hebben we ook een extra variabele 'tot_rec . gedeclareerd ’ van het datatype nummer. Deze variabele wordt gebruikt om het totale aantal gegevens vast te leggen dat in de tabel wordt opgeslagen.

Uitvoeringssectie

Als u naar de eerste instructie in de uitvoeringssectie kijkt. U zult zien dat ik met de verzamelmethode DELETE gegevens heb verwijderd van index 3 naar index 6. Dit betekent dat de index van onze verzameling nu niet sequentieel wordt gevuld. Dat verandert de aard van onze collectie van DENSE naar SPARSE.

Direct na de aanroep van de verzamelingsmethode DELETE hebben we onze FORALL-instructie met INDICES OF-gebonden clausule. Met behulp van deze verklaring voegen we in de verzameling 'my_nested_table' in de tabel tut_78 in.

Dan hebben we een SELECT-INTO-statement. Deze instructie retourneert het totale aantal rijen dat in de tabel tut_78 is ingevoegd en slaat die waarde op in de variabele tot_rec. Vervolgens gebruiken we de DBMS_OUTPUT-instructie en geven we de waarde weer die is opgeslagen in de variabele tot_rec met een opgemaakte string aan de gebruiker.

Ik raad je ten zeerste aan om deze tutorial op mijn YouTube-kanaal te bekijken voor een diepgaande uitleg van de hierboven besproken code. Vergeet je ook niet te abonneren op het kanaal voor meer interessante tutorials.

Bedankt, dat is een PL/SQL-tutorial over hoe u bulkgegevens kunt verwerken met behulp van de FORALL-instructie met INDICES OF-gebonden clausule. Ik hoop dat je het leuk vond om te lezen, als dat zo is, deel deze blog dan op je sociale media. Heb een geweldige dag!


  1. java.sql.SQLException:Toegang geweigerd voor gebruiker 'root'@'localhost' (met wachtwoord:JA)

  2. Trigger in SQL

  3. Evalueren wanneer een expressie in een query wordt geëvalueerd

  4. Converteer 'datetimeoffset' naar 'datetime' in SQL Server (T-SQL-voorbeelden)