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

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

Indtil videre har vi lært, hvordan man bruger FORALL-sætning med en tæt samling ved hjælp af Lower &Upper bound-sætning og en sparsom samling ved hjælp af INDICES OF bundet klausul. Hvad hvis vi kun vil bruge FORALL-sætningen med udvalgte elementer i samlingen? Kan vi gøre det? Ja, det kan vi nemt gøre ved at bruge FORALL-sætningen med den tredje og sidste bundne klausul, der er 'VALUES-OF'.

Hvad er en "Values-of" bundet klausul?

FORALL-sætning handler om at binde samlingselementerne med en enkelt DML-sætning på en optimeret måde. Ved at bruge 'Values-of' bundet klausul i FORALL-sætningen kan vi binde de valgte elementer i samlingen med DML-sætningen.

Hvad er syntaksen for 'Values-of' bundet klausul?

Før vi forstår, hvordan værdier af bundet klausul fungerer, lad os tage et kig på dens syntaks og lære, hvad der er den syntaktisk korrekte måde at bruge 'Values-of'-klausulen på med FORALL-sætningen i Oracle Database.

FORALL idx IN VALUES OF indexing-collection
[Save exception]
DML/MERGE statement;

Oplysninger:
Husk altid, at navnet på klausulen er VALUES-OF ikke VALUE-OF. At skrive VALUE-OF vil forårsage en fejl, som kan afslutte dit program.
VÆRDIER AF højre
VÆRDI AF forkert

Hvordan fungerer Values-of bound-klausulen?

Værdier-af bundet klausul vil kræve to samlinger. Den første samling vil være "Kildesamlingen" . Vi vil udføre DML-operationer såsom indsæt, slet og opdatering af dataene i denne samling ved hjælp af FORALL-sætningen.

Den anden samling vil være 'Indekseringssamlingen ’ som angiver indeksnummeret for valgte elementer fra den første samling. Disse valgte elementer vil være de elementer, som du vil udføre DML-handlingerne over.

Da Values-of bound-klausulen specificerer, at værdien af ​​Loop Index ('idx' i ovenstående syntaks) variabel i FORALL-sætningen er baseret på værdierne af elementet i den anden samling. Derfor har vi henvist til den anden samling som Indexing-collection i ovenstående syntaks.

Så hvad er denne indekseringssamling?

Indekseringssamling er en gruppe af indekser, som FORALL-sætningen kan gå igennem. Denne samling kunne være en tæt samling såvel som en sparsom samling. Også de indeksnumre, der er gemt i samlingen, behøver ikke at være unikke og kan opføres i en vilkårlig rækkefølge.

Er der nogen begrænsninger med Values-of-klausulen, som vi bør kende til?

Ja, der er et par ting, du skal vide, før du arbejder med værdier af bundet klausul i Oracle Database. Disse begrænsninger er –

  • Indekseringssamlingen skal være en NESTED TABEL eller en ASSOCIATIV ARRAY.
  • Hvis indekseringssamlingen er en associativ matrix, skal den indekseres af PLS_INTEGER eller BINARY_INTEGER.
  • Elementerne i indekseringssamlingen skal være af enten PLS_INTEGER eller BINARY_INTEGER.

Eksempel på Values-of bound-sætning med FORALL-sætning i Oracle Database:

Trin 1:Opret tabel

CREATE TABLE tut_79 (
    selected_data     NUMBER(5)
);

Trin 2:Skriv en PL/SQL-blok, der demonstrerer, hvordan man bruger Values-of-sætning med FORALL-sætning i Oracle Database.

SET SERVEROUTPUT ON;
DECLARE
    --Source collection
    TYPE My_NestedTable IS TABLE OF NUMBER;
    source_col My_NestedTable := My_NestedTable (9,18,27,36,45,54,63,72,81,90);
    
    --Indexing collection
    TYPE My_Array IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;
    index_col My_Array;
BEGIN
    --Initializing indexing collection with the index numbers.
    index_col   (1) :=  3;
    index_col   (5) :=  7;
    index_col   (12):=  8;
    index_col   (28):=  10;
    --FORALL statement 
    FORALL idx IN VALUES OF index_col
        INSERT INTO tut_79 VALUES (source_col (idx));
END;
/

Du kan se den detaljerede forklaring af denne kode i videovejledningen. Der har jeg forklaret hver enkelt linje i denne PL/SQL-blok i detaljer.

Det er selvstudiet om, hvordan man bruger Values-of bound-sætning med FORALL-sætning i Oracle Database. Håber du finder det nyttigt. Del venligst denne blog med dine venner på deres sociale medier. Abonner også på min YouTube-kanal for mere informative og interessante tutorials.

Tak og god dag.


  1. LOAD DATA INFILE tilsvarende i Oracle

  2. SQL Server:hvordan man efterligner oracle keep dense_rank forespørgsel?

  3. Hvordan kan jeg sikkerhedskopiere en ekstern SQL Server-database til et lokalt drev?

  4. tsql returnerer en tabel fra en funktion eller butiksprocedure