Vous êtes sur la page 1sur 17

Chapitre 3

Les curseurs
1. Présentation
• Dans le cas ou l’ordre SELECT renvoie plusieurs
lignes, il faut définir des curseurs
• Exemple: Écrire un bloc PL-SQL permettant
d’afficher les noms des pilotes dont les salaires
sont > à 2200DT
• Solution ?
SELECT nom Cette solution n’est pas
INTO v_nom valable parce qu’on ne peut
FROM Pilote pas affecter plusieurs Vals à
WHERE sal>2200; une seule variable.

2022/2023 54
2. Déclaration d’un curseur
• L’utilisation d’un curseur pour traiter un ordre
SELECT renvoyant plusieurs lignes nécessite les
étapes suivantes :
• Définir la requête SELECT et l’associer à un curseur:
Syntaxe :
CURSOR nom_curseur IS requête ;
Exemple :
CURSOR C1 IS SELECT nom
FROM pilote
WHERE sal<1200 ;
2022/2023 55
2. Déclaration d’un curseur
• Le curseur peut être aussi défini à l’aide de paramètres.
Ces paramètres peuvent être utilisés dans une condition
de sélection ou dans une expression
• Syntaxe :
CURSOR nom_curseur (nom_paramètre type [ :=valeur
par défaut] […]) IS requête ;
• Exemple :
DECLARE
CURSOR C2 (psal NUMBER(8,2), pcom NUMBER(8,2))
IS SELECT nom
FROM pilote
WHERE sal<psal AND comm> pcom ;

2022/2023 56
3. Ouverture d’un curseur
• L'ouverture du curseur alloue l’espace
mémoire au curseur, exécute l'ordre SELECT
associé au curseur. Cette action est effectuée
dans la section BEGIN du bloc.
• Syntaxe :
OPEN nom_curseur [(paramètre effectif)];

2022/2023 57
3. Ouverture d’un curseur
• Exemple :
DECLARE
CURSOR pl_nice IS
SELECT pl, plnom
FROM pilote
WHERE adr='Nice';
BEGIN
...
OPEN pl_nice;
...
END ;

2022/2023 58
4. Traitement des lignes
• Après l'exécution du SELECT les lignes ramenées
sont traitées une par une, la valeur de chaque
colonne du SELECT doit être stockée dans une
variable réceptrice.
• Syntaxe :
FETCH nom_curseur INTO liste_variables ;
• A chaque FETCH , le contenu de la ligne courante est
affectée dans les variables de la clause INTO et le
pointeur d’enregistrement est déplacé vers la ligne
suivante
2022/2023 59
4. Traitement des lignes
DECLARE
CURSOR pl_nice IS
SELECT pl, plnom, sal
FROM pilote
WHERE adr='Nice';
num pilote.pl%TYPE;
nom pilote.plnom%TYPE;
salaire pilote.sal%TYPE;
BEGIN
OPEN pl_nice;
LOOP
FETCH pl_nice INTO num, nom, salaire;
...
EXIT WHEN sal > 10 000;
END LOOP;
END ;
/
2022/2023 60
5. Fermeture d’un curseur
• Pour libérer la mémoire prise par le curseur, il
faut le fermer dès qu'on n'en a plus besoin.
• Syntaxe :
CLOSE nom_curseur ;

2022/2023 61
5. Fermeture d’un curseur
• Exemple :
DECLARE
CURSOR pl_nice IS
SELECT pl#, plnom, sal
FROM pilote
WHERE adr='Nice';
num pilote.pl#%TYPE;
nom pilote.plnom%TYPE;
salaire pilote.sal%TYPE;
BEGIN
OPEN pl_nice;
LOOP
FETCH pl_nice INTO num, nom,s alaire;
...
EXIT WHEN sal > 10 000;
END LOOP;
CLOSE pl_nice;
END ;

2022/2023 62
6.Exemple
• Écrire un bloc PLSQL permettant d’afficher les
noms et les salaires de tous les pilotes, dont les
salaire dépassent 2200.

2022/2023 63
6.Exemple
DECLARE Utilisation d’un type scalaire

CURSOR C3 IS SELECT nom, sal FROM pilote WHERE sal>2200;


V_nom pilote.nom%type;
V_sal pilote.sal%type;
BEGIN
OPEN C3;
LOOP
FETCH C3 INTO v_nom, v_sal;
EXIT WHEN C3%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Nom: ' || v_nom ||' Salaire: ' || v_sal);
END LOOP;
CLOSE C3;
END; 2022/2023 64
DECLARE
6.Exemple
TYPE t_pil IS RECORD Utilisation d’un type composé
(v_nom pilote.nom%type, enregistrement

v_sal pilote.sal%type);
r_pil t_pil;
CURSOR C3 IS SELECT nom,sal FROM pilote where sal>2200;
BEGIN
OPEN C3;
LOOP
FETCH C3 INTO r_pil;
EXIT WHEN C3%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Nom: ' || r_pil.v_nom ||' Salaire: ' ||
r_pil.v_sal);
END LOOP;
CLOSE C3;
2022/2023 65
END;
7. Forme syntaxique condensée
• Il existe une autre façon qui permet d’ouvrir
un curseur, traiter les lignes renvoyées par ce
curseur, ainsi que le fermer.
• Cette façon s’appelle la forme condensée et
utilise la structure FOR.
• Cependant, la déclaration se fait de la même
façon que précédemment.

2022/2023 66
7. Forme syntaxique condensée

• Remarque: Pas d’ouverture ou de fermeture


du curseur

2022/2023 67
7. Forme syntaxique condensée
Exemple:
DECLARE
i: BINARY_INTEGER
CURSOR C3 IS SELECT nom, sal FROM pilote WHERE sal>2200;
V_nom pilote.nom%type;
V_sal pilote.sal%type;
BEGIN
FOR i IN C3 ;
LOOP
FETCH C3 INTO V_nom,V_sal;
DBMS_OUTPUT.PUT_LINE('Nom: ' || v_nom ||' Salaire: '
|| v_sal);
END LOOP;
END; 2022/2023 68
8. Statuts d’un curseur

2022/2023 69

Vous aimerez peut-être aussi