Oracle Cursore PL/SQL: implicito, esplicito, ciclo For con esempio

Cos'รจ il CURSORE 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 mantenute dal cursore viene definito insieme attivo. รˆ inoltre possibile assegnare un nome a questi cursori in modo che possano essere referenziati da un'altra posizione del codice.

Il cursore รจ di due tipi.

  • Cursore implicito
  • Cursore esplicito

Cursore implicito

Ogni volta che si verifica un'operazione DML nel database, viene creato un cursore implicito che contiene le righe interessate in quella particolare operazione. Questi cursori non possono essere nominati e quindi non possono essere controllati o referenziati da un'altra posizione del codice. Possiamo fare riferimento solo al cursore piรน recente attraverso gli attributi del cursore.

Cursore esplicito

I programmatori possono creare un'area di contesto denominata per eseguire le proprie operazioni DML per ottenere un maggiore controllo su di essa. Il cursore esplicito dovrebbe essere definito nella sezione dichiarazioni del file Blocco PL/SQLe 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 denominata per l'istruzione 'SELECT' definita nella parte della dichiarazione. Il nome di quest'area di contesto รจ uguale al nome del cursore.
  • Cursore di aperturaL'apertura del cursore darร  istruzioni al PL / SQL per allocare la memoria per questo cursore. Renderร  il cursore pronto per recuperare i record.
  • Recupero dei dati dal cursoreIn questo processo, viene eseguita l'istruzione 'SELECT' e le righe recuperate vengono archiviate nella memoria allocata. Questi sono ora chiamati 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. Ciascuna istruzione fetch recupererร  un set attivo e conterrร  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 genererร  alcuna eccezione.
  • Chiusura del cursoreUna volta recuperato tutto il record, dobbiamo chiudere il cursore in modo che la memoria allocata a quest'area di contesto venga rilasciata.

Sintassi

DECLARE
CURSOR <cursor_name> IS <SELECT statement^>
<cursor_variable declaration>
BEGIN
OPEN <cursor_name>;
FETCH <cursor_name> INTO <cursor_variable>;
.
.
CLOSE <cursor_name>;
END;
  • Nella sintassi precedente, la parte di dichiarazione contiene la dichiarazione del cursore e la variabile 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 quello esplicito dispongono di 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 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 e restituirร  'TRUE' se l'operazione di recupero piรน recente non รจ riuscita a recuperare alcun record.
%รˆ APERTO Restituisce il risultato booleano 'VERO' se il cursore specificato รจ giร  aperto, altrimenti restituisce 'FALSO'
% ROWCOUNT Restituisce il valore numerico. Fornisce il conteggio effettivo dei record interessati dall'attivitร  DML.

Esempio di cursore esplicito:

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. Utilizzeremo anche l'attributo del cursore per impostare il ciclo per recuperare tutto il record dal cursore.

Oracle Cursore PL/SQL

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
lv_emp_name emp.emp_name%type;

BEGIN
OPEN guru99_det;

LOOP
FETCH guru99_det INTO lv_emp_name;
IF guru99_det%NOTFOUND
THEN
EXIT;
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:
/

Uscita

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY 
Total rows fetched is 3

Code Spiegazione

  • Code Linea 2: Dichiara il cursore guru99_det per l'istruzione 'SELECT emp_name FROM emp'.
  • Code Linea 3: Dichiarazione della variabile lv_emp_name.
  • Code Linea 5: Apertura del cursore guru99_det.
  • Code riga 6: Impostazione dell'istruzione loop Basic per recuperare tutti i record nella tabella 'emp'.
  • Code riga 7: Recupera i dati guru99_det e assegna il valore a lv_emp_name.
  • Code riga 9: Utilizzando l'attributo del cursore '%NOTFOUND' per verificare 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.
  • Code riga 11: Condizione EXIT per l'istruzione del ciclo.
  • Code riga 12: Stampa il nome del dipendente recuperato.
  • Code riga 14: Utilizzando l'attributo del cursore '%ROWCOUNT' per trovare il numero totale di record interessati/recuperati nel cursore.
  • Code riga 15: All'uscita dal ciclo il cursore viene chiuso e la memoria allocata viene liberata.

FOR Dichiarazione del cursore del ciclo

L'istruzione "FOR LOOP" puรฒ essere utilizzata per lavorare con i cursori. Possiamo fornire il nome del cursore invece del limite dell'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

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
  FOR I IN <cursor_name>
  LOOP
  .
  .
  END LOOP;
END;
  • Nella sintassi precedente, la parte di 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 รจ impostato nel ciclo FOR e la variabile del ciclo 'I' si comporterร  come variabile cursore in questo caso.

Oracle Cursore per esempio di loop:
In questo esempio, proietteremo tutti i nomi dei dipendenti dalla tabella emp utilizzando un ciclo cursore-FOR.

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp; 
BEGIN
FOR lv_emp_name IN guru99_det
LOOP
Dbms_output.put_line(โ€˜Employee Fetched:โ€˜||lv_emp_name.emp_name);
END LOOP;
END;
/

Uscita

Employee Fetched:BBB 
Employee Fetched:XXX
Employee Fetched:YYY

Code Spiegazione

  • Code Linea 2: Dichiara il cursore guru99_det per l'istruzione 'SELECT emp_name FROM emp'.
  • Code Linea 4: Costruisce il ciclo 'FOR' per il cursore con la variabile del ciclo lv_emp_name.
  • Code riga 5: Stampa del nome del dipendente in ogni iterazione del ciclo.
  • Code riga 8: Esci dal giro

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 da Ciclo FOR.

Riassumi questo post con: