Oracle
 sql >> Database >  >> RDS >> Oracle

Esempi di cursori PLSQL:espliciti, impliciti e di riferimento

Un cursore agisce logicamente come un puntatore a un risultato impostare. Puoi spostare il cursore attraverso il set di risultati, elaborando ogni riga, finché non determini di essere alla fine del set di risultati. Esistono tre tipi di sintassi associati ai cursori:creazione del cursore, recupero con il cursore e chiusura del cursore. Inoltre, ci sono una serie di attributi di un cursore che puoi usare nei tuoi confronti logici. I seguenti sono i tipi di cursori in Oracle:

Cursori espliciti

I cursori espliciti sono cursori che dichiari e usi.

Cursori impliciti

PL/SQL consente di includere istruzioni SQL, incluse le istruzioni SELECT, come parte del codice senza dichiarare un cursore, chiamato cursore implicito.

Cursori di riferimento

Un cursore fa riferimento a un set di risultati. Il REF CURSOR consente di passare un riferimento a un cursore da un'unità di programma PL/SQL a un'altra. In altre parole, ti permette di creare una variabile che riceverà un cursore e consentirà l'accesso al suo set di risultati, ma in questo blog sto fornendo esempi solo per i cursori espliciti e impliciti, farò un esempio per i cursori di riferimento e Cursore dinamico in un altro blog .Un esempio di cursore esplicito:DECLARE nemployeeid NUMBER; data di inizio DATA; data finale DATA; sjobid VARCHAR2 (20); -- dichiara il cursore CURSOR curjob IS SELECT employee_id, start_date, end_date, job_id FROM hr.job_history;BEGIN OPEN curjob; LOOP FETCH curjob INTO nemployeeid, dstartdate, denddate, sjobid; ESCI QUANDO curjob%NOTOUND; DBMS_OUTPUT.put_line( 'Employee ' || nemployeeid || 'aveva un lavoro' || sjobid || ' for ' || (denddate - dstartdate) || ' days.'); FINE CORSA; CLOSE curjob;END;/Di seguito viene fornito lo stesso esempio per il cursore esplicito ma con For Loop i cursori For Loop sono più intelligenti in quanto non è necessario dichiarare variabili per recuperare valori in essi e non è necessario aprire o chiudere o verificare se il puntatore è alla fine del cursore. Ecco l'esempio:DECLARE CURSOR curjob IS SELECT employee_id, start_date, end_date, job_id FROM hr.job_history;BEGIN FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Employee ' || jh_rec.employee_id || ' aveva un lavoro ' || jh_rec .job_id || ' for ' || ( jh_rec.end_date - jh_rec.start_date || ' giorni.')); END LOOP;END;/Un esempio di cursore implicito:DECLARE nempno NUMBER; CURSOR curjob IS SELECT employee_id, start_date, end_date, job_id FROM hr.job_history;BEGIN -- sotto la query sql c'è il tipo di cursore implicito SELECT COUNT ( * ) INTO nempno FROM hr.job_history; DBMS_OUTPUT.put_line ( 'Ci sono ' || nempno || ' record storici dei dipendenti.'); FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Employee ' || jh_rec.employee_id || ' aveva un lavoro ' || jh_rec.job_id || ' for ' || ( jh_rec.end_date - jh_rec.start_date || ' giorni.' )); FINE CICLO; FINE;/