Qu'est-ce que CURSOR en PL / SQL?
Un curseur est un pointeur vers cette zone de contexte. Oracle crée une zone de contexte pour traiter une instruction SQL qui contient toutes les informations sur l'instruction.
PL / SQL permet au programmeur de contrôler la zone de contexte via le curseur. Un curseur contient les lignes renvoyées par l'instruction SQL. L'ensemble de lignes que contient le curseur est appelé ensemble actif. Ces curseurs peuvent également être nommés de manière à pouvoir être référencés à partir d'un autre endroit du code.
Dans ce tutoriel, vous apprendrez-
- Curseur implicite
- Curseur explicite
- Attributs du curseur
- Instruction de curseur de boucle FOR
Le curseur est de deux types.
- Curseur implicite
- Curseur explicite
Curseur implicite
Chaque fois que des opérations DML se produisent dans la base de données, un curseur implicite est créé qui contient les lignes affectées, dans cette opération particulière. Ces curseurs ne peuvent pas être nommés et, par conséquent, ils ne peuvent pas être contrôlés ou référencés à partir d'un autre endroit du code. Nous ne pouvons faire référence qu'au curseur le plus récent via les attributs du curseur.
Curseur explicite
Les programmeurs sont autorisés à créer une zone de contexte nommée pour exécuter leurs opérations DML afin d'obtenir plus de contrôle sur celle-ci. Le curseur explicite doit être défini dans la section déclaration du bloc PL / SQL, et il est créé pour l'instruction 'SELECT' qui doit être utilisée dans le code.
Vous trouverez ci-dessous les étapes nécessaires à l'utilisation de curseurs explicites.
- Déclaration du curseur
Déclarer le curseur signifie simplement créer une zone de contexte nommée pour l'instruction 'SELECT' qui est définie dans la partie déclaration. Le nom de cette zone de contexte est identique au nom du curseur.
- Curseur d'ouverture
L'ouverture du curseur demandera au PL / SQL d'allouer de la mémoire pour ce curseur. Cela rendra le curseur prêt à récupérer les enregistrements.
- Récupération des données à partir du curseur
Dans ce processus, l'instruction 'SELECT' est exécutée et les lignes extraites sont stockées dans la mémoire allouée. Ceux-ci sont maintenant appelés ensembles actifs. La récupération des données à partir du curseur est une activité au niveau de l'enregistrement qui signifie que nous pouvons accéder aux données d'une manière enregistrement par enregistrement.
Chaque instruction d'extraction récupère un ensemble actif et contient les informations de cet enregistrement particulier. Cette instruction est identique à l'instruction 'SELECT' qui récupère l'enregistrement et l'assigne à la variable dans la clause 'INTO', mais elle ne lèvera aucune exception.
- Fermer le curseur
Une fois que tout l'enregistrement est récupéré maintenant, nous devons fermer le curseur pour que la mémoire allouée à cette zone de contexte soit libérée.
Syntaxe:
DECLARECURSORIS
- Dans la syntaxe ci-dessus, la partie déclaration contient la déclaration du curseur et la variable de curseur dans laquelle les données extraites seront affectées.
- Le curseur est créé pour l'instruction 'SELECT' qui est donnée dans la déclaration du curseur.
- Dans la partie exécution, le curseur déclaré est ouvert, récupéré et fermé.
Attributs du curseur
Le curseur implicite et le curseur explicite ont certains attributs accessibles. Ces attributs donnent plus d'informations sur les opérations du curseur. Vous trouverez ci-dessous les différents attributs du curseur et leur utilisation.
Attribut du curseur | Description |
%A TROUVÉ | Il renvoie le résultat booléen «TRUE» si l'opération d'extraction la plus récente a réussi à récupérer un enregistrement, sinon il retournera FALSE. |
%PAS TROUVÉ | Cela fonctionne à l'opposé de% FOUND, il retournera 'TRUE' si l'opération de récupération la plus récente n'a pu récupérer aucun enregistrement. |
%EST OUVERT | Il renvoie le résultat booléen 'TRUE' si le curseur donné est déjà ouvert, sinon il renvoie 'FALSE' |
% ROWCOUNT | Il renvoie la valeur numérique. Il donne le nombre réel d'enregistrements qui ont été affectés par l'activité DML. |
Exemple 1 : Dans cet exemple, nous allons voir comment déclarer, ouvrir, récupérer et fermer le curseur explicite.
Nous projetterons le nom de tous les employés de la table emp à l'aide d'un curseur. Nous utiliserons également l'attribut de curseur pour définir la boucle afin de récupérer tous les enregistrements du curseur.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;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:/
Production
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Explication du code:
- Ligne de code 2 : Déclaration du curseur guru99_det pour l'instruction 'SELECT emp_name FROM emp'.
- Ligne de code 3 : Déclaration de la variable lv_emp_name.
- Ligne de code 5 : Ouverture du curseur guru99_det.
- Ligne de code 6: Définition de l'instruction de boucle de base pour récupérer tous les enregistrements de la table 'emp'.
- Ligne de code 7: récupère les données guru99_det et attribue la valeur à lv_emp_name.
- Ligne de code 9: Utilisation de l'attribut de curseur '% NOTFOUND' pour savoir si tout l'enregistrement du curseur est récupéré. S'il est récupéré, il retournera 'TRUE' et le contrôle sortira de la boucle, sinon le contrôle continuera à récupérer les données du curseur et à imprimer les données.
- Ligne de code 11: condition EXIT pour l'instruction de boucle.
- Ligne de code 12: Imprimez le nom de l'employé récupéré.
- Ligne de code 14: Utilisation de l'attribut de curseur '% ROWCOUNT' pour trouver le nombre total d'enregistrements qui ont été affectés / récupérés dans le curseur.
- Ligne de code 15: Après la sortie de la boucle, le curseur se ferme et la mémoire allouée est libérée.
Instruction de curseur de boucle FOR
L'instruction "FOR LOOP" peut être utilisée pour travailler avec des curseurs. Nous pouvons donner le nom du curseur au lieu de la limite de plage dans l'instruction de boucle FOR afin que la boucle fonctionne du premier enregistrement du curseur au dernier enregistrement du curseur. La variable curseur, l'ouverture du curseur, la récupération et la fermeture du curseur se feront implicitement par la boucle FOR.
Syntaxe:
DECLARECURSORIS
- Dans la syntaxe ci-dessus, la partie déclaration contient la déclaration du curseur.
- Le curseur est créé pour l'instruction 'SELECT' qui est donnée dans la déclaration du curseur.
- Dans la partie exécution, le curseur déclaré est configuré dans la boucle FOR et la variable de boucle 'I' se comportera comme une variable de curseur dans ce cas.
Exemple 1 : Dans cet exemple, nous projetterons tous les noms d'employés de la table emp en utilisant une boucle curseur-FOR.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Production
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Explication du code:
- Ligne de code 2 : Déclaration du curseur guru99_det pour l'instruction 'SELECT emp_name FROM emp'.
- Ligne de code 4 : Construction de la boucle 'FOR' pour le curseur avec la variable de boucle lv_emp_name.
- Ligne de code 5: impression du nom de l'employé à chaque itération de la boucle.
- Ligne de code 8: quitter la boucle
Remarque: Dans la boucle Cursor-FOR, les attributs de curseur ne peuvent pas être utilisés car l'ouverture, l'extraction et la fermeture du curseur sont effectuées implicitement par la boucle FOR.