Académique Documents
Professionnel Documents
Culture Documents
Objectifs du cours
1. Description du mécanisme de fonctionnement des curseurs
Définition.
Types de curseur.
Deux types de curseurs peuvent être distingués :
NO
YES
Voici un exemple :
FETCH C1 INTO nom, salaire;
DECLARE EXIT WHEN C1%NOTFOUND;
nom employees.last_name%TYPE; DBMS_OUTPUT.PUT_LINE ( nom||' gagne
salaire employees.salary%TYPE; '||salaire || ' dollars');
CURSOR C1 IS SELECT last_name, END LOOP;
NVL(salary,0) FROM employees; DBMS_OUTPUT.PUT_LINE
BEGIN (C1%ROWCOUNT);
OPEN C1; CLOSE C1;
LOOP END; /
42
Exemple:
DECLARE
CURSOR emp_curseur IS SELECT employee_id, last_name FROM
employees;
CURSOR dept_curseur IS SELECT * FROM departments ORDER BY
department_id;
BEGIN
NULL;
END;
/
44
Exemple:
DECLARE
CURSOR emp_curseur IS SELECT employee_id, last_name
FROM employees;
BEGIN
OPEN emp_curseur;
END;
/
45
La clause FETCH.
DECLARE
CURSOR emp_cur IS SELECT * FROM employees ORDER BY employee_id;
emp_rec employees%ROWTYPE;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO emp_rec;
IF emp_cur%FOUND THEN
dbms_output.put_line('Employee ' || emp_rec.employee_id ||
' est : ' || emp_rec.last_name);
END IF;
END LOOP;
CLOSE emp_cur;
END;
/
→ Corrigez cet exemple et déterminez ce qu’il affiche.
48
DECLARE
CURSOR c1 is
SELECT last_name, employee_id, salary FROM employees
ORDER BY salary DESC;
my_name employees.last_name%TYPE;
my_empno employees.employee_id%TYPE;
my_sal employees.salary%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH c1 INTO my_name, my_empno, my_sal;
EXIT WHEN (C1%ROWCOUNT > 5) OR (C1%NOTFOUND);
dbms_output.put_line('Employee ' || my_name || ' (' || my_empno || ') touche ' ||
my_sal);
END LOOP;
CLOSE c1;
END;
/
49
Le curseur IMPLICITE est déclaré directement dans une structure FOR IN.
Cette structure permet de :
▪ Evite de déclarer le curseur dans la partie DECLARE.
▪ Avoir une Ouverture automatique du curseur (OPEN)
▪ Faire un FETCH automatique
▪ Avoir une Condition de sortie automatique
▪ Avoir Fermeture automatique du curseur
Syntaxe
FOR variable IN <nom_curseur> LOOP
--instructions
END LOOP;
50
BEGIN
LOOP
dbms_output.put_line('Employee #' || emp_rec.employee_id ||' est ' ||
emp_rec.last_name);
END LOOP;
END;
/
51
Ecrire un bloc anonyme PL/SQL qui affiche la liste des employés soit leur nom, leur id et
leur salaire trié par salaire descendant. Utilisez un curseur implicite.
DECLARE
i number :=0;
BEGIN
FOR C1 IN (SELECT last_name, employee_id, salary FROM employees
ORDER BY salary DESC)
LOOP
i:=i+1;
dbms_output.put_line('Employee ' || C1.last_name || ' (' || C1.employee_id
|| ') touche ' || C1.salary);