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;/![](http://www.sqldat.com/article/uploadfiles/202205/2022051017105706.jpg)