Académique Documents
Professionnel Documents
Culture Documents
Objectifs
6-2
1
Contenu du TP
6-3
Curseurs
A chaque instruction SQL exécutée par le serveur Oracle est
associé un curseur individuel :
• Un curseur implicite est déclaré et géré par le compilateur
PL/SQL pour toutes les instructions LMD et les instructions
PL/SQL SELECT.
• Un curseur explicite est déclaré et géré par le
programmeur.
6-4
2
Fonctionnalités des curseurs explicites
Table
100 King AD_PRES
101 Kochhar AD_VP
102 De Haan AD_VP
. . .
. . .
. . .
139 Seo ST_CLERK
Ensemble actif =
140 Patel ST_CLERK
Résultat d’une . . .
requête multiligne
6-5
Non
Oui
DECLARE OPEN FETCH VIDE ? CLOSE
6-6
3
Contrôler les curseurs explicites
1 Ouverture du curseur
Pointeur
de curseur
Pointeur
3 Fermeture du curseur de curseur
6-7
Contenu du TP
6-8
4
Déclarer un curseur
Syntaxe :
CURSOR cursor_name IS
select_statement;
Exemples :
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
DECLARE
v_locid NUMBER:= 1700;
CURSOR c_dept_cursor IS
SELECT * FROM departments
WHERE location_id = v_locid;
...
6-9
Exercice
6 - 10
5
Ouvrir le curseur
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
...
BEGIN
OPEN c_emp_cursor;
L'instruction OPEN
• exécute l'interrogation associée au curseur,
• identifie l'ensemble actif et
• positionne le pointeur de curseur sur la première ligne
6 - 11
L'instruction FETCH
• lit les données de la ligne en cours et les
stocke dans les variables de sortie PL/SQL.
• fait passer le pointeur à la ligne suivante de
l'ensemble actif.
6 - 12
6
Extraire des données du curseur
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
v_empno employees.employee_id%TYPE;
v_lname employees.last_name%TYPE;
BEGIN
OPEN c_emp_cursor;
LOOP
FETCH c_emp_cursor INTO v_empno, v_lname;
EXIT WHEN c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);
END LOOP;
END;
/
6 - 13
Fermer le curseur
...
LOOP
FETCH c_emp_cursor INTO empno, lname;
EXIT WHEN c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);
END LOOP;
CLOSE c_emp_cursor;
END;
/
L'instruction CLOSE
• désactive le curseur,
• libère la zone de contexte et
• annule la définition de l'ensemble actif.
Remarque : Bien qu'il soit possible de terminer le bloc PL/SQL sans fermer
les curseurs, prenez l'habitude de fermer les curseurs que vous déclarez
explicitement, afin de libérer les ressources.
6 - 14
7
Curseurs et enregistrements
6 - 15
Syntaxe :
FOR record_name IN cursor_name LOOP
statement1;
statement2;
. . .
END LOOP;
6 - 16
8
Boucles FOR de curseur
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
BEGIN
FOR emp_record IN c_emp_cursor
LOOP
DBMS_OUTPUT.PUT_LINE( emp_record.employee_id
||' ' ||emp_record.last_name);
END LOOP;
END;
/
6 - 17
6 - 18
9
Attribut %ISOPEN
6 - 19
6 - 20
10
Boucles FOR de curseur utilisant
des sous-interrogations
6 - 21
Exercice
6 - 22
11
Contenu du TP
6 - 23
Syntaxe :
CURSOR cursor_name
[(parameter_name datatype, ...)]
IS
select_statement;
6 - 24
12
Curseurs avec paramètres
DECLARE
CURSOR c_emp_cursor (deptno NUMBER) IS
SELECT employee_id, last_name
FROM employees
WHERE department_id = deptno;
...
BEGIN
OPEN c_emp_cursor (10);
...
CLOSE c_emp_cursor;
OPEN c_emp_cursor (20);
...
6 - 25
DECLARE
CURSOR c_emp_cursor (deptno NUMBER) IS
SELECT employee_id, last_name
FROM employees
WHERE department_id = deptno;
...
BEGIN
FOR emp_record IN c_emp_cursor (10);
...
6 - 26
13
Exercice
6 - 27
Quiz
6 - 28
14
Synthèse
6 - 29
Exercice
6 - 30
15