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

Dichiarazione FORALL con clausola vincolata INDICES-OF nel database Oracle

Perché la dichiarazione FORALL con INDICES OF Bound Clause?

L'istruzione FORALL con clausola Lower &Upper Bound è probabilmente il modo più semplice per l'elaborazione di dati in blocco fino a quando non si fa riferimento a una raccolta densa. Quando si tratta di una raccolta sparsa, la clausola Lower &Upper Bound non è forte. Inoltre, sfortunatamente nello scenario della vita reale le possibilità di lavorare con una raccolta densa sono molto inferiori rispetto a lavorare con una raccolta sparsa.

Ad ogni modo, se sei curioso, allora abbiamo fatto una dimostrazione. Scopri cosa succede quando utilizziamo la clausola Lower &Upper bound dell'istruzione FORALL con una raccolta sparsa nel video sul nostro canale YouTube qui.

Il difetto della clausola Lower &Upper bound dell'istruzione FORALL è che non può essere utilizzata con una raccolta sparsa. Questa lacuna può essere facilmente superata utilizzando opzioni come "Indici di ' o 'Valori di ' clausola vincolata. Questo tutorial riguarda la prima opzione.

Clausola INDICES-OF vincolata

Simile alla clausola Lower &Upper bound, la clausola INDICES-OF ci aiuta nell'elaborazione di massa dei dati consentendoci di scorrere la raccolta. L'unica differenza è che usando la clausola INDICES OF possiamo scorrere una raccolta densa e sparsa. Considerando che la clausola Lower &Upper bound funziona solo con una raccolta densa.

Sintassi della clausola INDICES OF vincolata

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

Dove:

PER TUTTI è una parola chiave riservata Oracle Database seguita da un Index. Questo indice è un contatore di loop definito in modo implicito dichiarato dal motore PL/SQL. Dopodiché devi scrivere un'altra parola chiave che è IN. Seguita dalla parola chiave IN abbiamo la nostra clausola vincolata che è INDICES OF.

Subito dopo aver scritto la frase riservata "INDICES OF" dobbiamo specificare la variabile di raccolta della raccolta di cui vogliamo utilizzare i dati. Sappiamo già che abbiamo fatto riferimento alla raccolta nel programma tramite la sua variabile di raccolta. A seguire, abbiamo l'opzione SALVA ECCEZIONE, questa è una scelta facoltativa. Quindi abbiamo un'istruzione DML che potrebbe essere qualsiasi istruzione DML o un'istruzione MERGE.

Assicurati che l'istruzione DML o l'istruzione MERGE che stai utilizzando con FORALL debba fare riferimento a una raccolta. Inoltre, un'istruzione FORALL può elaborare solo un DML o un'istruzione MERGE alla volta.

Esempio di clausola vincolata INDICES OF

Qui vedremo una dimostrazione della clausola vincolata INDICES OF con l'istruzione FORALL. Qui recupereremo i dati da una tabella nidificata sparse già inizializzata e li memorizzeremo in una tabella.

Come abbiamo appreso nel tutorial precedente, l'istruzione FORALL prende i dati dalla raccolta e li archivia in una tabella. Quindi creeremo prima una tabella.

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

Per rendere facile la dimostrazione abbiamo creato una tabella molto semplice con il nome tut_78. Questa tabella ha solo una colonna mul_tab di NUMBER tipo di dati.

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

Puoi trovare la spiegazione dettagliata del codice sopra nel video tutorial. Ma facciamo ancora una breve spiegazione anche qui.

Sezione di dichiarazione del blocco PL/SQL di cui sopra

In questa sezione abbiamo prima creato una tabella annidata con il nome "my_nested_table '. Contiene i dati del tipo di dati NUMBER. Quindi abbiamo dichiarato la sua variabile di raccolta "var_nt '. Usandolo abbiamo inizializzato i primi 10 indici memorizzando 10 elementi numerici nella nostra collezione.

Oltre a Nested Table e alla sua variabile di raccolta, abbiamo anche dichiarato una variabile aggiuntiva "tot_rec ' di tipo di dati numerico. Questa variabile verrà utilizzata per contenere il numero totale di dati che verranno archiviati nella tabella.

Sezione di esecuzione

Se guardi la prima istruzione nella sezione di esecuzione. Scoprirai che utilizzando il metodo di raccolta DELETE ho eliminato i dati dall'indice 3 all'indice 6. Ciò significa che ora l'indice della nostra raccolta non è popolato in sequenza. Ciò cambia la natura della nostra collezione da DENSE a SPARSO.

Subito dopo la chiamata DELETE al metodo di raccolta abbiamo la nostra istruzione FORALL con clausola vincolata INDICES OF. Usando questa affermazione stiamo inserendo nella raccolta 'my_nested_table' nella tabella tut_78.

Quindi abbiamo un'istruzione SELECT-INTO. Questa istruzione restituisce il numero totale di righe inserite nella tabella tut_78 e memorizza quel valore nella variabile tot_rec. Quindi, utilizzando l'istruzione DBMS_OUTPUT, stiamo visualizzando all'utente il valore memorizzato nella variabile tot_rec con una stringa formattata.

Ti consiglio vivamente di guardare questo tutorial sul mio canale YouTube per una spiegazione approfondita del codice sopra discusso. Inoltre, non dimenticare di iscriverti al canale per tutorial più interessanti.

Grazie, questo è un tutorial PL/SQL su come eseguire l'elaborazione di dati in blocco utilizzando l'istruzione FORALL con la clausola associata INDICES OF. Spero ti sia piaciuto leggere se è così, allora condividi questo blog sui tuoi social media. Buona giornata!