Elaborazione di dati in blocco utilizzando la dichiarazione FORALL
So che il tutorial precedente è stato una rapida pausa dalla nostra serie Bulk Collect. Dopotutto era la richiesta del pubblico e noi avevamo l'obbligo di soddisfarla. Ma non preoccuparti, siamo di nuovo in pista. Vediamo quindi l'introduzione all'elaborazione di dati in blocco utilizzando l'istruzione FORALL in Oracle Database.
Nel caso in cui non sai di quale tutorial sto parlando, controlla qui. Quindi ora veniamo all'argomento.
Cos'è una dichiarazione FORALL?
L'istruzione FORALL aiuta a elaborare i dati in blocco in modo ottimizzato inviando istruzioni DML o un'istruzione MERGE (se stai utilizzando 11g o superiore) in batch dal motore PL/SQL al motore SQL.
Puoi anche definire un'istruzione FORALL come un costrutto di ciclo di massa che esegue un'istruzione DML o un'istruzione MERGE una o più volte contemporaneamente.
La raccolta in blocco ottimizza la query e migliora le prestazioni riducendo i cambi di contesto. FORALL fa la stessa cosa per istruzioni DML come Inserisci, Elimina, Aggiorna o per un'istruzione MERGE.
Qual è la sintassi dell'istruzione FORALL?
La sintassi è piuttosto semplice, diamo un'occhiata.
FORALL index IN bound_clauses [SAVE EXCEPTION] DML statement;
Dove:
PER TUTTI è la parola chiave riservata Oracle.
Indice è un contatore di loop definito implicitamente che viene dichiarato dal motore PL/SQL come PLS_INTEGER. Poiché è implicitamente definito dal motore PL/SQL, quindi non è necessario definirlo. L'ambito dell'Indice è limitato all'istruzione FORALL in cui è definito.
Clausole_Bound sono le clausole che controllano il numero delle iterazioni del ciclo. Anche il valore dell'indice dipende da esso. Esistono tre tipi di clausole vincolate in Oracle PL/SQL di cui parleremo separatamente più avanti in questo tutorial.
RISPARMIA ECCEZIONE è una scelta facoltativa che mantiene l'istruzione FORALL in esecuzione anche quando l'istruzione DML causa un'eccezione. Queste eccezioni vengono salvate in un attributo cursore chiamato SQL%Bulk_Exceptions.
Informazioni:
A causa di SAVE EXCEPTION, l'istruzione FORALL non esce bruscamente anche in presenza di un'eccezione. Questo è un vantaggio dell'istruzione FORALL rispetto a FOR Loop.
Dichiarazione DML :L'istruzione DML potrebbe essere qualsiasi istruzione DML come INSERT, UPDATE o DELETE. Se stai utilizzando Oracle 11g o versioni successive, puoi anche utilizzare l'istruzione MERGE con FORALL. Ma devi assicurarti che la tua istruzione DML o MERGE faccia riferimento ad almeno una raccolta nella sua clausola VALUES o WHERE.
Inoltre, a differenza di FOR Loop, con l'istruzione FORALL possiamo usare solo un DML alla volta. Questo è il difetto di FORALL.
FORALL è un ciclo come FOR Loop?
No, sebbene l'istruzione FORALL esegua l'iterazione su tutte le righe di una raccolta ma non è un ciclo FOR. Se hai visto attentamente la sintassi, devi aver notato che, a differenza di "FOR Loop", il blocco dell'istruzione FORALL non inizia né con la parola chiave LOOP né termina con la parola chiave END LOOP.
Possiamo eseguire Inserisci e Aggiorna DML contemporaneamente usando FORALL?
No, sfortunatamente a differenza di FOR Loop con FORALL non possiamo eseguire più di un DML alla volta. Ciò significa che puoi eseguire Inserisci o Aggiorna contemporaneamente non entrambi insieme. Questa è una lacuna della dichiarazione FORALL.
Che cos'è l'attributo cursore SQL%Bulk_Exceptions?
L'attributo del cursore SQL%Bulk_Exceptions è una raccolta di record che ha due campi Error_Index e Error_Code. Error_Index memorizza il numero di iterazioni dell'istruzione FORALL nel corso delle quali si è verificata l'eccezione. D'altra parte Error_Code memorizza il codice di eccezione che corrisponde all'eccezione sollevata.
Possiamo vedere il numero di eccezioni che si sono verificate durante l'esecuzione dell'istruzione FORALL?
Puoi facilmente controllare quante eccezioni sono state sollevate durante l'esecuzione dell'istruzione FORALL utilizzando SQL%BULK_EXCEPTION.COUNT.
Cosa sono queste clausole vincolate? Raccontaci qualcosa su di loro.
Come accennato in precedenza, le clausole Bound controllano il valore dell'indice di ciclo e il numero di iterazioni dell'istruzione FORALL. Esistono tre tipi di clausole vincolate che possono essere utilizzate con l'istruzione FORALL in Oracle Database. Questi sono:
- Limite inferiore e superiore
- Indici di e
- Valori di
Il limite INFERIORE E SUPERIORE :Simile a FOR LOOP, in questa clausola vincolata devi specificare l'inizio e la fine validi dei numeri indice consecutivi della collezione di riferimento.
È necessario specificare un intervallo valido di numeri di indice consecutivi insieme a questa clausola vincolata per il numero di raccolte a cui si fa riferimento nell'istruzione DML. Tuttavia esiste una possibilità di errore se la raccolta a cui si fa riferimento con questa clausola risulta essere scarsa. L'errore che otterrai è questo:
ORA-22160: element at index [3] does not exist
Nel caso in cui la tua raccolta di riferimento sia scarsa e stai utilizzando Oracle 10g o superiore, potresti voler utilizzare le altre due opzioni che sono "Indici di" e "Valori di".
Gli INDICI DI :La seconda clausola vincolata a nostra disposizione è "Indici di". Questa clausola vincolata consente alla nostra istruzione FORALL di scorrere una raccolta sparsa come un array associativo o una tabella nidificata.
Lettura consigliata:Introduzione alla raccolta PL/SQL
I VALORI DI :La terza clausola vincolata è Values of. L'opzione VALUES OF chiarisce che i valori degli elementi della raccolta specificata del contatore di loop sono la base dei valori nell'istruzione FORALL. Fondamentalmente, questa raccolta è un gruppo di indici che l'istruzione FORALL può scorrere. Inoltre, questi indici non devono essere univoci e possono essere elencati in un ordine arbitrario.
Nel caso in cui impari più velocemente guardando il video tutorial, eccone uno che spiega in dettaglio la dichiarazione FORALL.
Impareremo come utilizzare tutte queste clausole vincolate con l'istruzione FORALL nei futuri tutorial, quindi resta sintonizzato. Per gli ultimi aggiornamenti puoi iscriverti al mio canale YouTube e seguirmi sui miei social.
Grazie e buona giornata!