Télécharger la présentation
Publié parBeaumont Godefroy Modifié depuis plus de 9 années
1
Chapitre 6.2 Les curseurs Cours SGBD 3A Mme hkimi Jihène
Année universitaire : 2011/2012
2
Introduction Nous avons vu que vous pouvez inclure des instructions SQL qui renvoient une ligne unique dans un bloc PL/SQL. Les données extraites par l'instruction SQL doivent être stockées dans des variables à l'aide de la clause INTO. Le serveur Oracle alloue une zone de mémoire privée appelée zone de contexte pour le traitement des instructions SQL. L'instruction SQL est analysée (parse) et traitée dans cette zone. Les informations requises pour le traitement et les informations extraites après le traitement sont toutes stockées dans cette zone
3
Introduction Etant donné que cette zone est gérée en interne par le serveur Oracle, vous ne pouvez pas la contrôler. Un curseur est un pointeur vers la zone de contexte. Cependant, ce curseur est un curseur implicite, géré automatiquement par le serveur Oracle. Lorsque le bloc exécute une instruction SQL, le compilateur PL/SQL crée un curseur implicite.
4
Introduction Il existe deux types de curseur :
Curseurs implicites : les curseurs implicites sont créés et gérés par le serveur Oracle. Vous n'y avez pas accès. Le serveur Oracle crée un tel curseur lorsqu'il doit exécuter une instruction SQL. Curseurs explicites : Ils sont créés et gérés par l'utilisateur pour traiter un ordre Select qui ramène plusieurs lignes. Le traitement du select se fera ligne par ligne.
5
Contrôler les curseurs explicites
1 Ouverture du curseur Pointeur de curseur 2 Extraction (fetch) d'une ligne Pointeur de curseur Pointeur de curseur 3 Fermeture du curseur
6
Déclaration d’un curseur
DECALRE CURSOR nom_curseur IS instruction select; EXEMPLES DECLARE CURSOR emp_curseur IS SELECT employee_id, last_name FROM employees; CURSOR dept_curseur IS SELECT * FROM department ORDER BY departement_id; Vous déclarez ces curseurs dans la section déclarative d'un bloc PL/SQL. Rappelez-vous que vous pouvez également déclarer les variables et les exceptions dans la section déclarative.
7
Ouverture d’un curseur
OPEN nom_curseur; Ouvre le curseur pour exécuter la requête et identifier l’ensemble des lignes. Si la requête ne retourne pas de ligne, aucune exception n’est signalée. Utilisez les attributs du curseur pour tester le résultat après l’affectation; EXEMPLE DECLARE CURSOR emp_curseur IS SELECT employee_id, last_name FROM employees; BEGIN OPEN emp_curseur; END; /
8
Ramener les données à partir d’un curseur
FETCH nom_curseur INTO [variable1, variable2, … | record_name]; Charger les valeurs de la ligne courante dans des variables de sortie. Prévoir le même nombre de variables. Tester si le curseur contient des lignes.
9
Ramener des lignes à partir d’un curseur :Exemple
DECLARE v_empno employees.employee_id%type; v_ename employees.last_name%type; CURSOR emp_curseur IS SELECT employee_id, last_name FROM employees; BEGIN IF NOT emp_curseur%ISOPEN THEN OPEN emp_curseur; END IF; FETCH emp_curseur INTO v_empno, v_ename; WHILE emp_curseur%FOUND LOOP dbms_output.put_line (v_empno ||' '|| v_ename); END LOOP; CLOSE emp_curseur; END; /
10
Attributs des curseurs
Obtenir les informations d'état concernant un curseur : Attribut Type Description %ISOPEN Booléen Prend la valeur TRUE si le curseur est ouvert %NOTFOUND Booléen Prend la valeur TRUE si la dernière extraction (fetch) ne renvoie pas de ligne %FOUND Booléen Prend la valeur TRUE si la dernière extraction renvoie une ligne ; complément de %NOTFOUND %ROWCOUNT Nombre Prend la valeur correspondant au nombre total de lignes renvoyées jusqu'à présent
11
Attributs des curseurs:%isopen
Utilisez l’attribut du curseur : %ISOPEN avant de réaliser une affectation, pour tester si le curseur est ouvert. EXEMPLE DECLARE CURSOR emp_curseur IS SELECT employee_id, last_name FROM employees; BEGIN IF NOT emp_curseur%ISOPEN THEN OPEN emp_curseur; END IF; END; /
12
Attributs des curseurs:%found / %notfound
DECLARE v_empno emp.empno%type; v_ename emp.ename%type; CURSOR emp_curseur IS SELECT employee_id, last_name FROM employees; BEGIN IF NOT emp_curseur%ISOPEN THEN OPEN emp_curseur; END IF FETCH emp_curseur INTO v_empno, v_ename; WHILE emp_curseur%FOUND … END; /
13
Attributs des curseurs:%rowcount
DECLARE CURSOR emp_curseur IS SELECT employee_id, last_name FROM employees; v_empno employees.employee_id%type; v_ename employees.last_name%type; BEGIN IF NOT emp_curseur%ISOPEN THEN OPEN emp_curseur; END IF; FETCH emp_curseur INTO v_empno, v_ename; WHILE emp_curseur%FOUND LOOP dbms_output.put_line(emp_curseur%rowcount); END LOOP; CLOSE emp_curseur; END; /
14
Fermeture d’un curseur
CLOSE nom_curseur; EXEMPLE DECLARE CURSOR emp_curseur IS SELECT employee_id, last_name FROM employees; BEGIN OPEN emp_curseur; …. CLOSE emp_curseur; END; /
15
Utilisation simplifiée des curseurs(1)
La simplification déclare implicitement une structure dont les éléments sont de même type que les colonnes retournées par le curseur. DECLARE CURSOR CUR_EMP IS SELECT EMPLOYEE_ID,LAST_NAME FROM EMPLOYEES; STRUCTURE_EMP CUR_EMP%ROWTYPE; Pour utiliser les colonnes de la structure : STRUCTURE_EMP.last_name La structure est renseignée par le fetch. Fetch CUR_EMP into STRUCTURE_EMP;
16
Utilisation simplifiée des curseurs(2) For..IN
La syntaxe FOR IN est encore plus consise,elle évite de déclarer le curseur dans la partie declare. -- pas de déclaration du curseur dans la partie declare Begin For rec_emp in (select employee_id,last_name,job_id from employees) Loop -- ouverture automatique du curseur -- fetch automatique -- condition de sortie automatique Traitement …. …. End loop; -- fermeture automatique du curseur End;
17
Utilisation simplifiée des curseurs(2) For..IN
Avec la version simplifiée ,l’exemple précédent devient: -- pas de déclaration du curseur -- pas de déclaration de structure Begin For emp_struct in (select employee_id,last_name,job_id from employees); Loop Traitement… On utilise les variables par: emp_struct.employee_id… End loop; -- Fermeture automatique End;
18
Curseurs paramétrés Un curseur paramétré peut servir plusieurs fois avec des valeurs des paramètres différentes. On doit fermer le curseur entre chaque utilisation de paramètres différents (sauf si on utilise « for » qui ferme automatiquement le curseur) Declare Cursor Nom_cur (param 1 type, param 2 type, …) is Nom_ordre_select ;
19
Curseurs paramétrés Begin Open Nom_cur(val1,val2..); …. Close Nom_cur;
End; Le passage des valeurs des paramètres s’effectue lors de l’ouverture du curseur.
20
Curseurs paramétrés :exemple
declare cursor cur(p_dept integer) is select department_id, last_name from employees where department_id= p_dept; begin for employee in cur(10) loop Dbms_output.put_line(employee.last_name); end loop; for employee in cur(20) loop end;
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.