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!