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

โšก Riepilogo intelligente

Cursori in Oracle In PL/SQL, i puntatori puntano all'area di contesto che contiene le righe restituite da un'istruzione SQL. Ne esistono due tipi: i cursori impliciti, creati automaticamente per le operazioni DML, e i cursori espliciti, dichiarati e controllati dal programmatore.

  • ๐Ÿ“ Area di contesto: Il cursore punta all'area di contesto che memorizza un'istruzione SQL e il relativo set attivo restituito.
  • โš™๏ธ Cursore implicito: Oracle Apre automaticamente un cursore implicito per ogni istruzione DML e SELECT INTO a riga singola.
  • โœ‹ Cursore esplicito: Un programmatore dichiara, apre, recupera e chiude un cursore esplicito per il controllo completo.
  • ๐Ÿ”Ž Attributi del cursore: %FOUND, %NOTFOUND, %ISOPEN e %ROWCOUNT indicano lo stato dell'operazione piรน recente.
  • ๐Ÿ” Ciclo FOR con cursore: Un ciclo FOR apre, recupera e chiude un cursore in modo implicito, senza bisogno di interventi manuali.
  • ๐Ÿค– Assistenza AI: Gli assistenti basati sull'IA, come GitHub Copilot, gestiscono i cicli del cursore di bozza e segnalano i cursori non chiusi.

Oracle Cursore PL/SQL implicito, esplicito e ciclo FOR

Cos'รจ il CURSORE in PL/SQL?

Il cursore รจ un puntatore all'area di contesto. Oracle crea un'area di contesto per l'elaborazione di un SQL dichiarazione, e quest'area contiene tutte le informazioni sulla dichiarazione.

PL / SQL Consente al programmatore di controllare l'area di contesto tramite il cursore. Un cursore contiene le righe restituite dall'istruzione SQL e l'insieme di righe contenute nel cursore รจ chiamato set attivo. A questi cursori puรฒ anche essere assegnato un nome in modo da potervi fare riferimento da un altro punto del codice.

Il cursore รจ di due tipi:

  • Cursore implicito
  • Cursore esplicito

Cursore implicito

Ogni volta che uno qualsiasi operazione DML Quando si verifica un'operazione nel database, viene creato un cursore implicito che contiene le righe interessate da tale operazione. A questi cursori non รจ possibile assegnare un nome e, di conseguenza, non possono essere controllati o richiamati da altre parti del codice. รˆ possibile fare riferimento solo al cursore piรน recente tramite gli attributi del cursore.

Cursore esplicito

Ai programmatori รจ consentito creare un'area di contesto denominata per eseguire le proprie operazioni DML e ottenere un maggiore controllo su di essa. Il cursore esplicito deve essere definito nella sezione di dichiarazione del 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:

  • Dichiarazione del cursore: Dichiarare il cursore significa semplicemente creare un'area di contesto denominata per l'istruzione SELECT definita nella sezione di dichiarazione. Il nome di quest'area di contesto รจ lo stesso del nome del cursore.
  • Apertura del cursore: L'apertura del cursore indica a PL/SQL di allocare la memoria per tale cursore, rendendolo pronto per il recupero dei record.
  • Recupero dei dati dal cursore: In questo processo, l'istruzione SELECT viene eseguita e le righe recuperate vengono memorizzate nella memoria allocata. Queste vengono ora chiamate set attivi. Il recupero dei dati dal cursore รจ un'attivitร  a livello di record, il che significa che possiamo accedere ai dati record per record. Ogni istruzione fetch recupera un set attivo e contiene le informazioni di quel particolare record. Questa istruzione รจ uguale a un'istruzione SELECT che recupera il record e lo assegna alla variabile nella clausola INTO, ma non genererร  alcun errore. eccezioni.
  • Chiusura del cursore: Una volta recuperati tutti i record, รจ necessario 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 sopra riportata, la parte di dichiarazione contiene la dichiarazione del cursore e della variabile cursore a cui verranno assegnati i dati recuperati. Il cursore viene creato per l'istruzione SELECT specificata nella dichiarazione del cursore. Nella parte di esecuzione, il cursore dichiarato viene aperto, i dati vengono recuperati e il cursore viene chiuso.

Attributi del cursore

Sia il cursore implicito che quello esplicito possiedono determinati attributi accessibili. Questi attributi forniscono maggiori informazioni sulle operazioni del cursore. Di seguito sono riportati i diversi attributi del cursore e il loro utilizzo.

Attributo cursore Descrizione
%TROVATO Restituisce il valore booleano TRUE se l'ultima operazione di recupero ha recuperato correttamente un record; altrimenti restituisce FALSE.
%NON TROVATO Funziona in modo opposto a %FOUND. Restituisce TRUE se l'ultima operazione di recupero non ha trovato alcun record.
%รˆ APERTO Restituisce il valore booleano TRUE se il cursore specificato รจ giร  aperto; altrimenti restituisce FALSE.
% ROWCOUNT Restituisce un valore numerico che indica il numero effettivo di record interessati o recuperati dall'operazione.

Esempio esplicito di cursore: In questo esempio, vedremo come dichiarare, aprire, recuperare e chiudere un cursore esplicito. Proietteremo tutti i nomi dei dipendenti dalla tabella emp utilizzando un cursore. Useremo anche un attributo del cursore per impostare il ciclo in modo che recuperi tutti i record dal cursore.

Lo screenshot qui sotto mostra questo esempio di cursore esplicito e il suo output in Oracle.

Esempio esplicito di cursore per recuperare i nomi dei dipendenti dalla tabella emp in Oracle 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%ROWCOUNT);
CLOSE guru99_det;
END;
/

Uscita

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

Code Spiegazione

  • Code riga 2: Dichiarazione del cursore guru99_det per l'istruzione 'SELECT emp_name FROM emp'.
  • Code riga 3: Dichiarazione della variabile lv_emp_name con il %tipo ancorato a emp.emp_name.
  • Code riga 5: Apertura del cursore guru99_det.
  • Code riga 6: Impostazione dell'istruzione di ciclo di base 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 8: Si utilizza l'attributo del cursore %NOTFOUND per verificare se tutti i record nel cursore sono stati recuperati. In caso affermativo, restituisce TRUE ed esce dal ciclo; altrimenti, il controllo continua a recuperare i dati dal cursore e li stampa.
  • Code riga 10: 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 รจ possibile trovare il numero totale di record recuperati dal cursore.
  • Code riga 15: Dopo l'uscita dal ciclo, il cursore viene chiuso e la memoria allocata viene liberata.

FOR Dichiarazione del cursore del ciclo

Un cursore Ciclo FOR Puรฒ essere utilizzato per lavorare con i cursori. Possiamo specificare il nome del cursore anzichรฉ un limite di intervallo nell'istruzione del ciclo FOR, in modo che il ciclo funzioni dal primo all'ultimo record del cursore. La variabile cursore, l'apertura del cursore, il recupero e la chiusura del cursore vengono tutti gestiti implicitamente dal ciclo FOR.

Sintassi

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
FOR I IN <cursor_name>
LOOP
.
.
END LOOP;
END;

Nella sintassi sopra riportata, la parte di dichiarazione contiene la dichiarazione del cursore. Il cursore viene creato per l'istruzione SELECT specificata nella dichiarazione del cursore. Nella parte di esecuzione, il cursore dichiarato viene impostato nel ciclo FOR e la variabile di ciclo 'I' si comporta in questo caso come la variabile cursore.

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

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 riga 2: Dichiarazione del cursore guru99_det per l'istruzione 'SELECT emp_name FROM emp'.
  • Code riga 4: Costruzione del ciclo FOR per il cursore con la variabile di ciclo lv_emp_name.
  • Code riga 6: Stampa del nome del dipendente in ogni iterazione del ciclo.
  • Code riga 7: Esci dal ciclo (FINE CICLO).

Nota: In un ciclo FOR con cursore, gli attributi del cursore non possono essere utilizzati, poichรฉ l'apertura, il recupero e la chiusura del cursore vengono eseguiti implicitamente dal ciclo FOR.

DOMANDE FREQUENTI

Un REF CURSOR (variabile cursore) รจ un puntatore al set di risultati di una query. A differenza di un cursore statico, puรฒ aprire query diverse in fase di esecuzione e passare i risultati tra blocchi PL/SQL o a programmi client.

Un cursore normale preleva una riga per ogni operazione di prelievo, causando numerosi cambi di contesto. RITIRO IN BLOCCO Carica numerose righe in una collezione con una singola operazione di recupero, riducendo drasticamente il sovraccarico su set di risultati di grandi dimensioni.

Sรฌ. Dichiara un cursore parametrizzato come CURSOR c(rept NUMBER) IS SELECT โ€ฆ, quindi passa i valori in OPEN c(10). I parametri ti consentono di riutilizzare una definizione di cursore con valori di filtro diversi.

FOR UPDATE blocca le righe selezionate dal cursore, impedendo a chiunque altro di modificarle. WHERE CURRENT OF aggiorna o elimina quindi la riga esatta appena recuperata, senza ripetere la condizione WHERE.

I cursori aperti mantengono la memoria riservata e vengono conteggiati nel limite OPEN_CURSORS. Lasciarne molti aperti alla fine genera l'errore ORA-01000: numero massimo di cursori aperti superato, quindi chiudere sempre un cursore esplicito dopo l'uso.

Ogni operazione FETCH commuta tra i motori PL/SQL e SQL. Migliaia di questi cambi di contesto si sommano, quindi una singola istruzione SQL basata su insiemi o BULK COLLECT elabora in genere le stesse righe molto piรน velocemente.

Sรฌ. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub genera cicli OPEN, FETCH e CLOSE espliciti o cicli FOR con cursore da un commento, aggiunge controlli di uscita %NOTFOUND e suggerisce nomi di attributi, anche se รจ consigliabile rivedere prima la logica.

Gli assistenti basati sull'IA segnalano i cicli di cursore riga per riga che potrebbero trasformarsi in query SQL basate su insiemi o BULK COLLECT, individuano i cursori non chiusi e spiegano il comportamento degli attributi %. Questa analisi basata sull'apprendimento automatico migliora le prestazioni prima che il codice raggiunga la produzione.

Riassumi questo post con: