Oracle
 sql >> Base de données >  >> RDS >> Oracle

Exemples de curseurs PLSQL - Curseurs explicites, implicites et de référence

Un curseur agit logiquement comme un pointeur dans un jeu de résultats. Vous pouvez déplacer le curseur dans le jeu de résultats, en traitant chaque ligne, jusqu'à ce que vous vous trouviez à la fin du jeu de résultats. Il existe trois types de syntaxe associés aux curseurs :création du curseur, extraction avec le curseur et fermeture du curseur. De plus, il existe un certain nombre d'attributs d'un curseur que vous pouvez utiliser dans vos comparaisons logiques. Voici les types de curseurs dans Oracle :

Curseurs explicites

Les curseurs explicites sont des curseurs que vous déclarez et utilisez.

Curseurs implicites

PL/SQL vous permet d'inclure des instructions SQL, y compris des instructions SELECT, dans le cadre de votre code sans déclarer de curseur, appelé curseur implicite.

Curseurs de référence

Un curseur fait référence à un jeu de résultats. Le CURSEUR REF permet de passer une référence de curseur d'une unité de programme PL/SQL à une autre. En d'autres termes, cela vous permet de créer une variable qui recevra un curseur et permettra l'accès à son jeu de résultats, mais dans ce blog, je donne des exemples uniquement pour les curseurs explicites et implicites, je donnerai des exemples pour les curseurs de référence et Curseur dynamique dans un autre blog .Un exemple de curseur explicite : DECLARE nemployeeid NUMBER ; dstartdate DATE ; date de fin DATE ; sjobid VARCHAR2 (20); -- déclarer le curseur 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 ; EXIT QUAND curjob%NOTFOUND ; DBMS_OUTPUT.put_line( 'Employee ' || nemployeeid || 'had job ' || sjobid || ' for ' || (denddate - dstartdate) || ' days.'); FIN DE BOUCLE ; CLOSE curjob;END;/Le même exemple est donné ci-dessous pour le curseur explicite mais avec For Loop, les curseurs For Loop sont plus intelligents car il n'est pas nécessaire de déclarer des variables pour en extraire des valeurs et pas besoin d'ouvrir ou de fermer ou de vérifier si le pointeur est à la fin du curseur. Voici l'exemple :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 || ' had job ' || jh_rec .job_id || ' for ' || ( jh_rec.end_date - jh_rec.start_date || ' jours.')); END LOOP;END;/Un exemple de curseur implicite :DECLARE nempno NUMBER ; CURSOR curjob IS SELECT employee_id, start_date, end_date, job_id FROM hr.job_history;BEGIN -- la requête sql ci-dessous est le type de curseur implicite SELECT COUNT ( * ) INTO nempno FROM hr.job_history; DBMS_OUTPUT.put_line ( 'Il y a ' || nempno || ' enregistrements d'historique des employés.'); FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Employee ' || jh_rec.employee_id || ' avait un emploi ' || jh_rec.job_id || ' for ' || ( jh_rec.end_date - jh_rec.start_date || ' jours.' )); FIN BOUCLE;FIN;/