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

FORALL erklæring med INDICES-OF bundet klausul i Oracle-databasen

Hvorfor FORALL erklæring med INDICES OF Bound-klausul?

FORALL-sætning med Lower &Upper Bound-klausul er sandsynligvis den nemmeste måde at behandle massedata på, indtil vi refererer til en tæt samling. Når det kommer til sparsom indsamling, står Lower &Upper Bound-klausulen ikke stærkt. I virkelighedens scenarier er chancerne for at arbejde med tæt samling desværre også meget lavere end at arbejde med en sparsom samling.

Anyways, hvis du er nysgerrig, så har vi lavet en demonstration. Se, hvad der sker, når vi bruger Lower &Upper bound-sætning af FORALL-sætningen med sparsom samling i videoen på vores YouTube-kanal her.

Manglen ved Lower &Upper bound-klausulen i FORALL-sætningen er, at den ikke kan bruges med en sparsom samling. Denne mangel kan nemt overvindes ved at bruge muligheder som "Indeks-af ' eller 'Værdier-af ’ bundet klausul. Denne vejledning handler udelukkende om den tidligere mulighed.

INDICES-OF Bound-klausul

Svarende til Lower &Upper bound-klausulen INDICES-OF-klausul hjælper os med massedatabehandling ved at lade os iterere gennem samlingen. Den eneste forskel er, at vi ved at bruge INDICES OF-klausulen kan iterere gennem en tæt såvel som en sparsom samling. Hvorimod Lower &Upper bound-sætning kun virker med en tæt samling.

Syntaks for INDICES OF bundet klausul

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

Hvor:

FORALL er et reserveret søgeord i Oracle Database efterfulgt af et indeks. Dette indeks er en implicit defineret loop-tæller, som er deklareret af PL/SQL-motoren. Derefter skal du skrive et andet søgeord, som er IN. Efterfulgt af IN nøgleord har vi vores bundne klausul, som er INDICES OF.

Lige efter at have skrevet den reserverede sætning 'INDICES OF' skal vi angive samlingsvariablen for den samling, hvis data vi vil bruge. Vi ved allerede, at vi refererede til samlingen i programmet gennem dens indsamlingsvariabel. Efterfulgt af det har vi muligheden GEM UNDTAGELSE, dette er et valgfrit valg. Så har vi en DML-sætning, dette kunne være en hvilken som helst DML-sætning eller en MERGE-sætning.

Sørg for, at DML-sætningen eller MERGE-sætningen, du bruger med FORALL, skal referere til en samling. Også en FORALL-sætning kan kun behandle én DML eller en MERGE-sætning på én gang.

Eksempel på INDICES OF bundet klausul

Her vil vi se en demonstration af INDICES OF bundet klausul med FORALL-sætning. Her vil vi hente dataene fra en allerede initialiseret sparse indlejret tabel og gemme dem i en tabel.

Som vi lærte i den forrige tutorial, tager FORALL-sætningen dataene fra samlingen og gemmer dem i en tabel. Derfor vil vi først oprette en tabel.

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

For at gøre demonstrationen nem har vi lavet en meget enkel tabel med navnet tut_78. Denne tabel har kun én kolonne mul_tab af NUMBER datatype.

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 finde den detaljerede forklaring af ovenstående kode i videovejledningen. Men lad os stadig få en hurtig forklaring her også.

Erklæringsafsnittet i ovenstående PL/SQL-blok

Her i dette afsnit oprettede vi først en indlejret tabel med navnet 'min_indlejrede_tabel ’. Den indeholder dataene for NUMBER datatype. Derefter erklærede vi dens samlingsvariabel 'var_nt ’. Ved at bruge det initialiserede vi de første 10 indekser ved at gemme 10 numeriske elementer i vores samling.

Udover Nested Table og dens samlingsvariabel erklærede vi også en ekstra variabel "tot_rec ' af nummerdatatype. Denne variabel vil blive brugt til at opbevare det samlede antal data, der vil blive gemt i tabellen.

Udførelsessektion

Hvis du ser på det første udsagn i udførelsesafsnittet. Du vil opdage, at jeg ved at bruge indsamlingsmetoden DELETE har slettet data fra indeks 3 til indeks 6. Det betyder, at nu er indekset for vores samling ikke udfyldt sekventielt. Det ændrer karakteren af ​​vores samling fra DENSE til SPARSE.

Lige efter indsamlingsmetoden DELETE-kaldet har vi vores FORALL-sætning med INDICES OF bundet klausul. Ved at bruge denne erklæring indsætter vi i samlingen 'my_nested_table' i tabellen tut_78.

Så har vi en SELECT-INTO-sætning. Denne sætning returnerer det samlede antal rækker indsat i tabellen tut_78 og lagrer denne værdi i variablen tot_rec. Så ved at bruge DBMS_OUTPUT-sætningen viser vi værdien, der er gemt i variablen tot_rec med en formateret streng til brugeren.

Jeg anbefaler stærkt, at du ser denne tutorial på min YouTube-kanal for en dybdegående forklaring af den ovenfor diskuterede kode. Glem heller ikke at abonnere på kanalen for flere interessante tutorials.

Tak, det er PL/SQL-tutorial om, hvordan man laver massedatabehandling ved hjælp af FORALL-sætning med INDICES OF bundet klausul. Håber du nød at læse, hvis ja, så del denne blog på dine sociale medier. Hav en god dag!


  1. 6 måder at slette duplikerede rækker, der har en primær nøgle i Oracle

  2. PostgreSQL DISTINCT ON med forskellig ORDER BY

  3. Brug MySQL Relational Databases på CentOS 5

  4. ISJSON() Eksempler i SQL Server (T-SQL)