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);