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

Come utilizzare la clausola di raccolta in blocco con l'istruzione SELECT INTO nel database Oracle

Clausola di raccolta collettiva con dichiarazione SELECT INTO

Benvenuto nel secondo tutorial della serie PL/SQL Bulk Collect in cui impareremo a utilizzare la clausola BULK COLLECT con l'istruzione SELECT-INTO.

Gli interruttori di contesto sono buoni, ma solo quando hanno un numero basso. Un numero maggiore di cambi di contesto potrebbe causare problemi quali scarse prestazioni delle query. Questo sovraccarico causato dai cambi di contesto potrebbe essere facilmente controllato se riuscissimo a comprimerli. Questo è esattamente ciò che imparerai in questo tutorial.

Puoi saperne di più su SELECT-INTO qui .

Quando dovremmo utilizzare la raccolta in blocco con l'istruzione Select-Into?

Quando sei certo che il risultato di ritorno della tua istruzione SELECT è piccolo quindi dovresti usare la clausola Bulk Collect con l'istruzione Select-Into. Altrimenti la tua clausola di raccolta in blocco renderà la tua dichiarazione Select-Into un mostro che monopolizza la memoria. Di conseguenza rallenterà le prestazioni del database.

Cosa devo fare se la mia istruzione SELECT sta recuperando un numero enorme di righe?

È sempre possibile utilizzare la clausola LIMIT insieme a Bulk Collect per limitare il numero di righe recuperate dal database. Ma questo è possibile solo quando utilizziamo la clausola Bulk Collect con i cursori PL/SQL. Tuttavia, ne discuteremo in dettaglio nel prossimo tutorial.

Perché non possiamo limitare i dati recuperati utilizzando Bulk Collect nell'istruzione SELECT-INTO?

Quando utilizziamo la clausola Bulk Collect con l'istruzione SELECT-INTO, utilizza implicito cursore per svolgere il compito di elaborazione di dati di massa. Tuttavia, la clausola Limit può essere utilizzata solo con la clausola Bulk Collect, quando quest'ultima utilizza il Cursore esplicito per il trattamento dei dati.

Quando la clausola Bulk Collect utilizza un cursore implicito e quando un cursore esplicito?

Se utilizziamo Bulk Collect Clause con un'istruzione SQL come SELECT-INTO, utilizza un cursore implicito. D'altra parte, ogni volta che utilizziamo la clausola Bulk Collect con l'istruzione FETCH, utilizza un cursore esplicito.

Ti consiglio di leggere come creare un cursore esplicito per ulteriori informazioni sull'istruzione FETCH.

Possiamo memorizzare il risultato restituito dalla clausola bulk collect in una variabile di tipo di dati primitivo?

No, al momento le raccolte PL/SQL sono gli unici tipi di dati di supporto per l'elaborazione di dati in blocco con clausola di raccolta in blocco nel database Oracle. Nel caso in cui tenti di archiviare i dati recuperati utilizzando la clausola Bulk Collect in una variabile di tipo di dati come Char, Number o Varchar2, riceverai un errore che leggerà qualcosa del genere:

"PLS-00497:Impossibile combinare tra riga singola e riga multipla (BULK) nell'elenco INTO"

Definizione di raccolta in blocco nella dichiarazione
L'istruzione "Bulk Collect Into" seleziona più dati da una colonna e li archivia in una raccolta SQL.

Sintassi della clausola Bulk Collect con istruzione Select-Into.

La sintassi per l'utilizzo della clausola di raccolta in blocco PL/SQL con l'istruzione Select-Into in Oracle Database è la seguente:

SELECT column_list
 BULK COLLECT INTO collection_datatype_name 
FROM table_name 
WHERE <where clause> 
ORDER BY <column list>;

Dove:

Elenco colonne è l'elenco delle colonne da cui vuoi recuperare i dati.

Nome del tipo di dati della raccolta sarà il nome della variabile di raccolta che conterrà i dati restituiti dalla clausola di raccolta in blocco.

Inoltre, ricorda sempre che ogni colonna specificata per il recupero dei dati deve contenere un tipo di dati di raccolta corrispondente per contenere quei dati. Perché il motore di runtime PL/SQL archivia sempre i dati recuperati dalla colonna nella raccolta in modo parallelo.

Ad esempio

SELECT column_1, column_2 BULK COLLECT INTO collection_1, collection2 FROM table;

Qui i dati recuperati dalla colonna_1 verranno archiviati automaticamente nella raccolta_1 e i dati dalla colonna_2 nella raccolta_2 automaticamente.

Nome tabella potrebbe essere il nome di qualsiasi tabella da cui desideri recuperare i dati.

A seguire abbiamo le clausole WHERE e ORDER BY che sono facoltative ma se vuoi puoi usarle.

Ora che abbiamo discusso la sintassi, facciamo un semplice esempio per imparare a lavorare con la clausola PL/SQL Bulk Collect con l'istruzione SELECT INTO in Oracle Database.

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
    TYPE nt_lName   IS TABLE OF VARCHAR2 (20);
    
    fname   nt_fName;
    lName   nt_lName;
BEGIN
    SELECT first_name, last_name 
        BULK COLLECT INTO fName, lName 
    FROM employees; 
        
        --Print values from the collection--
    FOR idx IN 1..fName.COUNT
    LOOP
        DBMS_OUTPUT.PUT_LINE (idx||' - '||fName (idx) ||' '||lName (idx));
    END LOOP;
END;
/

Spiegazione dell'esempio

Qui abbiamo un codice molto semplice per dimostrare come utilizzare Bulk Collect Clause con l'istruzione Select-Into. Nella sezione di dichiarazione di questo codice abbiamo prima creato due raccolte di tipo Nested Table "nt_fName" e "nt_lName" con le corrispondenti variabili di raccolta "fName" e "lName". In effetti, entrambe queste raccolte verranno utilizzate per contenere i dati restituiti dall'istruzione Select-Into.

Puoi leggere come creare una tabella nidificata qui.

Nella sezione dichiarazione abbiamo la nostra istruzione Select-Into con clausola Bulk Collect. Inoltre, utilizzando questa istruzione Select-Into, stiamo recuperando tutti i dati dalla colonna Nome e Cognome della tabella dipendenti. E con l'aiuto della clausola Bulk Collect memorizziamo tali dati nelle raccolte corrispondenti in modo parallelo.

Tranne insieme all'istruzione Select-Into abbiamo anche un "For Loop" che sta stampando i dati di entrambe le raccolte sullo schermo di output.

Da vedere
Assicurati di controllare il video in cui ho dimostrato come Bulk Collect Clause comprime più switch di contesto in uno e migliora le prestazioni della query. Ecco il link.

Questo è il tutorial che spiega in dettaglio i concetti della clausola Bulk Collect con l'istruzione Select-Into. In questo tutorial ho provato a rispondere a tutte le possibili domande che potresti dover affrontare nel tuo esame di certificazione così come nel colloquio.

Spero ti sia piaciuto leggere. Assicurati di CONDIVIDERE questo blog con i tuoi amici sui tuoi social. Grazie e buona giornata!