Cos'è CURSOR in PL / SQL?
Un cursore è un puntatore a quest'area di contesto. Oracle crea un'area di contesto per l'elaborazione di un'istruzione SQL che contiene tutte le informazioni sull'istruzione.
PL / SQL consente al programmatore di controllare l'area di contesto tramite il cursore. Un cursore contiene le righe restituite dall'istruzione SQL. L'insieme di righe trattenuto dal cursore viene definito insieme attivo. Questi cursori possono anche essere denominati in modo che possano essere indicati da un altro punto del codice.
In questo tutorial imparerai-
- Cursore implicito
- Cursore esplicito
- Attributi del cursore
- Istruzione FOR Loop Cursor
Il cursore è di due tipi.
- Cursore implicito
- Cursore esplicito
Cursore implicito
Ogni volta che si verificano operazioni DML nel database, viene creato un cursore implicito che contiene le righe interessate, in quella particolare operazione. Questi cursori non possono essere denominati e, quindi, non possono essere controllati o indicati da un altro punto del codice. Possiamo fare riferimento solo al cursore più recente tramite gli attributi del cursore.
Cursore esplicito
I programmatori possono creare un'area di contesto con nome per eseguire le loro operazioni DML per ottenere un maggiore controllo su di essa. Il cursore esplicito deve essere definito nella sezione della dichiarazione del blocco PL / SQL e viene creato per l'istruzione "SELECT" che deve essere utilizzata nel codice.
Di seguito sono riportati i passaggi necessari per lavorare con i cursori espliciti.
- Dichiarare il cursore
Dichiarare il cursore significa semplicemente creare un'area di contesto con nome per l'istruzione "SELECT" definita nella parte della dichiarazione. Il nome di questa area di contesto è uguale al nome del cursore.
- Cursore di apertura
L'apertura del cursore indicherà a PL / SQL di allocare la memoria per questo cursore. Renderà il cursore pronto per recuperare i record.
- Recupero dei dati dal cursore
In questo processo, viene eseguita l'istruzione "SELECT" e le righe recuperate vengono archiviate nella memoria allocata. Questi sono ora chiamati come set attivi. Il recupero dei dati dal cursore è un'attività a livello di record, il che significa che possiamo accedere ai dati in modo record per record.
Ogni istruzione fetch recupererà un set attivo e conserverà le informazioni di quel particolare record. Questa istruzione è uguale all'istruzione "SELECT" che recupera il record e lo assegna alla variabile nella clausola "INTO", ma non genera eccezioni.
- Chiusura del cursore
Una volta recuperato tutto il record, è necessario chiudere il cursore in modo che la memoria allocata a quest'area di contesto venga rilasciata.
Sintassi:
DECLARECURSORIS
- Nella sintassi precedente, la parte della dichiarazione contiene la dichiarazione del cursore e la variabile del cursore in cui verranno assegnati i dati recuperati.
- Il cursore viene creato per l'istruzione "SELECT" fornita nella dichiarazione del cursore.
- Nella parte di esecuzione, il cursore dichiarato viene aperto, recuperato e chiuso.
Attributi del cursore
Sia il cursore implicito che il cursore esplicito hanno determinati attributi a cui è possibile accedere. Questi attributi forniscono ulteriori informazioni sulle operazioni del cursore. Di seguito sono riportati i diversi attributi del cursore e il loro utilizzo.
Attributo del cursore | Descrizione |
%TROVATO | Restituisce il risultato booleano "TRUE" se l'operazione di recupero più recente ha recuperato un record con successo, altrimenti restituirà FALSE. |
%NON TROVATO | Funziona in modo opposto a% FOUND, restituirà "TRUE" se l'operazione di recupero più recente non è in grado di recuperare alcun record. |
%È APERTO | Restituisce il risultato booleano "TRUE" se il cursore specificato è già aperto, altrimenti restituisce "FALSE" |
% ROWCOUNT | Restituisce il valore numerico. Fornisce il conteggio effettivo dei record interessati dall'attività DML. |
Esempio 1 : in questo esempio, vedremo come dichiarare, aprire, recuperare e chiudere il cursore esplicito.
Proietteremo tutto il nome del dipendente dalla tabella emp utilizzando un cursore. Useremo anche l'attributo del cursore per impostare il ciclo per recuperare tutto il record dal cursore.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;END IF;Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name);END LOOP;Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT);CLOSE guru99_det;END:/
Produzione
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Spiegazione del codice:
- Riga di codice 2 : dichiarazione del cursore guru99_det per l'istruzione "SELECT emp_name FROM emp".
- Riga di codice 3 : dichiarazione della variabile lv_emp_name.
- Riga di codice 5 : apertura del cursore guru99_det.
- Riga di codice 6: impostazione dell'istruzione del ciclo di base per recuperare tutti i record nella tabella "emp".
- Riga di codice 7: recupera i dati guru99_det e assegna il valore a lv_emp_name.
- Riga di codice 9: utilizzo dell'attributo del cursore '% NOTFOUND' per scoprire se tutto il record nel cursore è stato recuperato. Se recuperato, restituirà 'TRUE' e il controllo uscirà dal ciclo, altrimenti il controllo continuerà a recuperare i dati dal cursore e stamperà i dati.
- Riga di codice 11: condizione EXIT per l'istruzione loop.
- Riga di codice 12: stampa il nome del dipendente recuperato.
- Riga di codice 14: utilizzo dell'attributo del cursore "% ROWCOUNT" per trovare il numero totale di record interessati / recuperati nel cursore.
- Riga di codice 15: dopo essere usciti dal loop, il cursore viene chiuso e la memoria allocata viene liberata.
Istruzione FOR Loop Cursor
L'istruzione "FOR LOOP" può essere utilizzata per lavorare con i cursori. Possiamo dare il nome del cursore invece del limite di intervallo nell'istruzione del ciclo FOR in modo che il ciclo funzioni dal primo record del cursore all'ultimo record del cursore. La variabile del cursore, l'apertura del cursore, il recupero e la chiusura del cursore verranno eseguiti implicitamente dal ciclo FOR.
Sintassi:
DECLARECURSORIS
- Nella sintassi precedente, la parte della dichiarazione contiene la dichiarazione del cursore.
- Il cursore viene creato per l'istruzione "SELECT" fornita nella dichiarazione del cursore.
- Nella parte di esecuzione, il cursore dichiarato viene impostato nel ciclo FOR e la variabile del ciclo 'I' si comporterà come variabile del cursore in questo caso.
Esempio 1 : in questo esempio, proietteremo tutto il nome del dipendente dalla tabella emp utilizzando un ciclo FOR cursore.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Produzione
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Spiegazione del codice:
- Riga di codice 2 : dichiarazione del cursore guru99_det per l'istruzione "SELECT emp_name FROM emp".
- Riga di codice 4 : costruzione del ciclo "FOR" per il cursore con la variabile di ciclo lv_emp_name.
- Riga di codice 5: stampa del nome del dipendente in ogni iterazione del ciclo.
- Riga di codice 8: Esci dal ciclo
Nota: nel ciclo Cursor-FOR, gli attributi del cursore non possono essere utilizzati poiché l'apertura, il recupero e la chiusura del cursore vengono eseguiti implicitamente dal ciclo FOR.