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

Come utilizzare la clausola di raccolta in blocco PL/SQL con l'istruzione FETCH INTO

Clausola di raccolta collettiva con dichiarazione FETCH INTO

Nel tutorial precedente siamo riusciti a comprimere più opzioni di contesto in una singola utilizzando PL/SQL Bulk Collect con l'istruzione SELECT-INTO. L'istruzione SELECT-INTO è una query standard SQL, il che significa che lo sviluppatore non ha molto controllo sull'esecuzione dell'istruzione.

Se parliamo di prestazioni delle query, non possiamo andare oltre un'estensione con l'istruzione SELECT-INTO. Vediamo come possiamo superare tutte queste carenze dell'istruzione SELECT-INTO.

In questo blog imparerai come utilizzare la clausola Bulk Collect con l'istruzione FETCH-INTO di un cursore esplicito. Poiché le istruzioni FETCH fanno parte del ciclo di vita del cursore, è necessaria una conoscenza pratica del cursore esplicito per una migliore comprensione di questo tutorial. Per lo stesso puoi dare un'occhiata al tutorial su come creare un cursore esplicito nel database Oracle.

Perché dovremmo usare la clausola Bulk Collect con l'istruzione FETCH INTO?

Come accennato nel blog precedente, ogni volta che utilizziamo Bulk-Collect con l'istruzione SELECT-INTO, il motore di runtime utilizza il cursore implicito per elaborare l'attività. Ma se utilizziamo Bulk Collect con l'istruzione FETCH-INTO, il motore di runtime utilizzerà il cursore esplicito per elaborare l'attività.

Un cursore esplicito ci aiuta sempre a ottenere un controllo anticipato sulle nostre query SQL standard. Ad esempio con un cursore esplicito possiamo controllare quando recuperare i record o quanti record vogliamo recuperare contemporaneamente, tuttavia ciò non è possibile in caso di istruzione SELECT-INTO.

Qual ​​è la sintassi di Bulk Collect con istruzione Fetch-Into?

Analogamente all'istruzione SELECT-INTO, la clausola di raccolta in blocco funziona come attributo dell'istruzione FETCH-INTO. Ecco la sintassi

FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;

Le istruzioni FETCH fanno parte del cursore esplicito. Se provi a eseguirli senza dichiarare il cursore principale, riceverai un errore. Ricorda inoltre sempre che le raccolte PL/SQL sono l'unica struttura supportata per la raccolta in blocco.

Esempio:come utilizzare PL/SQL Bulk Collect con l'istruzione FETCH-INTO in Oracle Database.

SET SERVEROUTPUT ON;
DECLARE
--Create an explicit cursor
    CURSOR exp_cur IS
    SELECT first_name FROM employees;

    --Declare collection for holding the data 
    TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
    fname   nt_fName;
BEGIN
    OPEN exp_cur;
    LOOP
        FETCH exp_cur BULK COLLECT INTO fname;
        EXIT WHEN fname.count=0;
        --Print data
        FOR idx IN fname.FIRST.. fname.LAST
        LOOP
            DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) );
        END LOOP; 
    END LOOP;
    CLOSE exp_cur;
END;
/

Ho spiegato in dettaglio ogni singola riga di questo intero codice nel video tutorial sul mio canale YouTube. Puoi guardare questo tutorial.

Poiché in questo codice abbiamo utilizzato la clausola Bulk Collect con l'istruzione fetch into, significa che il cambio di contesto non sarà un problema. Come sappiamo, la clausola bulk collect comprime più switch in uno unico, quindi nessun ulteriore collo di bottiglia delle prestazioni.

Ma significa che questo codice è ben ottimizzato e non necessita di ulteriori ottimizzazioni? O del resto, le prestazioni delle query non saranno mai un problema per noi in futuro?

Resta sintonizzato, per ottenere le risposte a tutte queste domande e per scoprire come possiamo ottimizzare ulteriormente questo programma PL/SQL.

Spero che questo blog ti sia piaciuto. Se hai dubbi o domande o pensi che mi sia dimenticato di citare qualcosa in questo blog allora scrivimi sulla mia pagina Facebook o Twitter. Grazie e buona giornata!