Abbiamo già visto nel tutorial precedente come creare una variabile di tipo record basata su cursore basata su cursore semplice che restituisce una singola riga di dati. Ora la domanda che sorge qui è che possiamo usare la stessa variabile del tipo di dati a record singolo con il cursore che restituisce più righe di dati? Per conoscere la risposta, continua a leggere e impara come gestire più valori restituiti da un cursore utilizzando una singola variabile del tipo di dati del record basata sul cursore.
Poiché abbiamo a che fare con i record basati sul cursore, è necessaria un po' di conoscenza del cursore. Per motivi di semplicità e per rendere questo concetto facile da capire, userò un cursore esplicito semplice per la dimostrazione.
Passaggio 1:dichiara un cursore esplicito semplice
Un tipo di dati di record basato su cursore richiede un cursore già creato. Questo cursore diventerà una base sottostante per la nostra variabile del tipo di record. Tutti i campi della variabile del tipo di record che viene creata utilizzando questo cursore avranno lo stesso nome e tipo di dati di quelli delle colonne utilizzate nella SELECT-List del cursore.
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200;
A differenza del cursore dell'esercitazione precedente che restituisce una singola riga di dati, questo cursore restituirà più righe. Tutte queste righe saranno composte dal nome e dallo stipendio di tutti i dipendenti con ID dipendente maggiore di 200.
Fase 2:dichiara la variabile del tipo di dati del record basata sul cursore
Poiché abbiamo creato il cursore, ora siamo tutti impostati per dichiarare la nostra variabile di record utilizzando questo cursore.
var_emp cur_RebellionRider%ROWTYPE;
Var_emp è la variabile del tipo di record e poiché è basata sul cursore cur_RebellionRider, quindi possiamo chiamarla con orgoglio una variabile del tipo di record basata sul cursore. Ora dobbiamo vedere se questa singola variabile di record è in grado di contenere tutti i dati restituiti dal cursore sottostante cur_RebellionRider.
Passaggio 3:inizializza la variabile del record del cursore
Come abbiamo discusso nell'esercitazione PL/SQL 34, l'inizializzazione di una variabile record è il processo di assegnazione di alcuni valori ad essa. In caso di cursori, l'istruzione FETCH-INTO fa questo lavoro. Ma dobbiamo assicurarci di aver seguito correttamente il ciclo di vita del cursore.
Se non sai qual è questo ciclo di vita del cursore e i passaggi necessari per creare un cursore, dai un'occhiata a questo blog su "Introduzione al cursore del database".
BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary ); END LOOP;--Simple Loop End CLOSE cur_RebellionRider; END;
La precedente sezione di esecuzione del blocco PL/SQL che stiamo creando qui è stata spiegata riga per riga nel tutorial video sul mio canale YouTube. Dai un'occhiata.
Quindi è così. Questo è tutto ciò che dobbiamo. Ora uniamo tutti questi blocchi di codice che abbiamo visto nei diversi passaggi precedenti in un unico blocco PL/SQL anonimo.
Variabile del tipo di dati del record basata su cursore in Oracle Database
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200; var_emp cur_RebellionRider%ROWTYPE; BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary); END LOOP; CLOSE cur_RebellionRider; END;
Quando compili ed esegui il codice sopra, otterrai tutti i dati che l'istruzione FETCH-INTO ha recuperato dal cursore cur_RebellionRider e archiviato nella variabile di record basata sul cursore var_emp. Ciò implica che possiamo effettivamente gestire più righe di dati utilizzando un singolo record basato su cursore.
Nel mio tutorial video PL/SQL ho chiesto se possiamo semplificare questo codice o esiste un altro modo per eseguire lo stesso compito. La risposta è sì, ci sono più modi per ottenere lo stesso risultato e uno di questi è usare "Cursor For-Loop". Questo è un tipo speciale di ciclo che dichiara la variabile record così come Apre, Recupera e Chiude il cursore sottostante implicitamente in background per te. Puoi leggere più Cursor For-Loop qui.
Libro di riferimento per SQL Expert 1z0-047 Link di affiliazione
OCA Oracle Database SQL Certified Expert Exam Guide (Esame 1Z0-047)
Ecco il codice fatto usando Cursor For-Loop che è equivalente al codice sopra. Come puoi vedere, è molto meno complesso con poche Line-of-Codes (LOC).
SET SERVEROUTPUT ON; BEGIN FOR var_emp IN (SELECT first_name, salary FROM employees WHERE employee_id >200) LOOP DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary); END LOOP; END;
Entrambi i codici restituiranno lo stesso risultato poiché entrambi stanno svolgendo la stessa attività.
Spero che questo tutorial dettagliato su PL/SQL ti sia piaciuto. Per favore, assicurati di condividere questo sul tuo social e taggami mentre regalo ogni mese la merce di RebellionRider a un utente selezionato a caso. Seguimi anche sui miei social media [Twitter/Facebook/Instagram] per aggiornamenti regolari.
Grazie e buona giornata!