Académique Documents
Professionnel Documents
Culture Documents
Plan du cours
1
Chapitre 2 : Le Langage PL/SQL
2
Introduction
Pour traiter une commande SQL, PL/SQL ouvre une zone de contexte
pour exécuter la commande et stocker les informations.
Cette zone de contexte est une mémoire de taille fixe, utilisée par le
noyau pour analyser et interpréter tout ordre SQL.
Le curseur explicite
Il est créé et géré par l'utilisateur pour traiter un ordre Select qui ramène
plusieurs lignes. Le traitement du select se fera ligne par ligne
Les curseurs explicites servent à retourner plusieurs lignes avec un select
3
Les curseurs
Le curseur peut être implicite (pas déclaré par l’utilisateur) ou explicite
4
Attributs du curseur implicite
PL/SQL fournit des attributs permettant d’évaluer le résultat d’un
curseur implicite
Ces attributs sont utilisables comme des fonctions dans les ordres
PL/SQL MAIS PAS dans les commandes SQL.
Attribut Description
SQL%ROWCOUNT Entier : Nombre de lignes affectées par le dernier ordre
SQL
Booléen : TRUE si le dernier ordre SQL affecte au moins
SQL%FOUND une ligne
SQL%NOTFOUND Booléen : TRUE si le dernier ordre SQL n’affecte aucune
ligne
Exemple
DECLARE
V_Rows_Updated NUMBER;
BEGIN
UPDATE EMP
SET sal = sal*1.1
WHERE deptno = 10;
V_Rows_Updated := SQL%ROWCOUNT;
10
10
5
Curseur explicite
Un curseur permet de "récupérer" un ensemble de
tuples, résultat d'une requête d'interrogation sur la base de données et de le
manipuler de manière procédurale, i.e. en balayant un par un les
tuples/enregistrements.
Le rôle des curseurs est d'établir la transition entre l'univers BD et celui des
langages procéduraux classiques.
Définition: Un curseur est défini dans la partie déclarative d'un bloc PL/SQL
par une requête d'interrogation en SQL (sa structure correspond aux attributs
du SELECT),
Exemple:
CURSOR C_pilote IS
SELECT num_pil, nom_pil FROM pilote
ORDER BY num_pil, nom_pil ;
11
11
Le curseur explicite
Pour traiter une requête qui retourne plusieurs lignes, l'utilisateur
doit définir un curseur qui lui permet d’extraire la totalité des
lignes sélectionnées.
12
12
6
La déclaration d'un curseur
La déclaration du curseur permet de stocker l'ordre Select dans le
curseur...
Le curseur se définit dans la partie DECALRE d'un bloc PL/SQL.
Cursor nomcurseur [(nompararn type [,nomparam type, .. )]
IS Commande_SELECT
Exemple :
Declare
Cursor DEPT_10 is
select ename, sal
from emp
where depno = 10;
13
13
La syntaxe :
OPEN nomcurseur [(nomparam1[,nomparam2 , . .)]
/* traitement des lignes */
CLOSE nomcurseur
Exemple :
Begin
…
OPEN DEPT_10
/* traitement des lignes*/
CLOSE DEPT_10
14
14
7
Le traitement des lignes
Il faut traiter les lignes une par une et renseigner les variables
réceptrices définies dans la partie DECLARE du bloc.
FETCH nomcurseur
INTO nomvariable |nomrecord
15
15
Exemple récapitulatif
Declare
Cursor DEPT_10 is select ename, sal from emp where depno = 10;
Vnom emp.name%TYPE ;
Vsalaire emp.sal%TYPE ;
Begin
OPEN DEPT_10;
LOOP
FETCH DEPT10 into vnom, vsalaire ;
--Traitement ligne
END LOOP ;
CLOSE DEPT_10;
End;
16
16
8
Les attributs d’un curseur
Les attributs d’un curseur nous fournissent des informations sur
l’exécution d’un ordre. Ils sont conservés par PL/SQL après
l’exécution du curseur (implicite ou explicite)
17
17
Les attributs:%Found
L'attribut %NotFound
Cet attribut est de type booléen (vrai ou faux)
Pour les curseurs implicites, cet attribut est vrai si les instructions insert,
update, delete traitent au moins une ligne. Pour les curseurs explicites, il
est vrai si le fetch ramène au moins une ligne.
L'attribut %NotFound
cet attribut est de type booléen (vrai ou faux)
Pour les curseurs implicites, cet attribut est vrai si les instructions insert,
update, delete ne traitent aucune ligne. Pour les curseurs explicites, il est
vrai si le fetch ne ramène plus de ligne.
18
18
9
Les attributs %IsOpen & %RowCount
L'attribut %IsOpen
Cet attribut est de type booléen soit vrai, soit faux.
Le curseur implicite est toujours faux car Oracle referme toujours les
curseurs qu'il ouvre après chaque utilisation.
Le curseur explicite est vrai si le curseur est ouvert.
L'attribut %RowCount
Cet attribut est de type numérique. Le curseur implicite indique le
nombre de lignes traités par les ordres insert, update, delete.
Le curseur explicite est incrémenté à chaque ordre fetch, donc cet
attribut traduit la nième ligne traitée.
19
19
L'attribut %Rowtype
Cet attribut permet la déclaration implicite d'une structure dont les
éléments sont d'un type identique aux colonnes ramenées par le
curseur.
20
20
10
Les boucles et les curseurs
L'objectif est de fournir au programmeur une structure simple et
efficace pour utiliser les structures de boucle et les curseurs.
21
21
22
22
11
Boucle FOR pour un curseur : exemple
Exemple:
DECLARE
CURSOR dept_10 IS
Select ename,sal FROM emp WHERE deptno = 10
ORDER BY sal;
BEGIN Variable de type
dept_10%ROWTYPE
FOR nom_rec IN dept_10;
LOOP
IF salaire >2500 THEN
INSERT INTO resultat VALUES (nom_rec.ename, nom_rec.sal);
END IF;
END LOOP;
END;
23
23
DECLARE
CURSOR C1 IS
SELECT Cnom, Sal FROM chercheur WHERE Labno=10;
24
24
12
Les curseurs paramétrés
Définition: Un curseur paramétré est un curseur dont la requête
contient des variables dont les valeurs ne seront fixées qu'a l'ouverture.
Déclaration: On précise la liste des noms et des type des paramètres
entre parenthèses après le nom du curseur :
Par exemple, créons une requête qui, pour une mère donnée, nous
donne la liste des noms et prénoms de ses enfants :
CURSOR enfants ( numparent NUMBER) IS
SELECT
FROM PERSONNE
WHERE mere = numparent;
25
25
Par exemple,
OPEN enfants ( 1 ) ;
26
26
13
Boucle pour & curseurs paramétrés
La boucle pour se charge de l'ouverture, il convient donc de placer les
paramètres dans l'entête de la boucle,
Par exemple,
27
27
Remarques:
Le seul ordre qui offre le choix entre curseur implicite et explicite est
le SELECT lorsqu’il ne ramène qu’une seule ligne.
Il n’existe pas de curseur explicite de mise à jour
Un curseur explicite ne peut être qu’un SELECT : utiliser
systématiquement des CE pour les ordres SELECT
Inconvénients de CI par rapport au CE
28
28
14
Remarques:
Curseurs implicites: Gérés automatiquement par le noyau dans les cas suivants:
• Une instruction SELECT exécutée sous SQL Developer
• Une instruction SELECT donnant une seule ligne de résultat sous
PL/SQL
• Les instructions UPDATE, INSERT et DELETE
29
29
Récap
Jusqu’à présent, nous avons vu comment récupérer le résultat de
requêtes SQL dans des variables PL/SQL lorsque ce résultat ne
comporte au plus qu’une seule ligne.
Bien evidemment, cette situation est loin de représenter le cas général :
les requêtes renvoient très souvent un nombre important et non
prévisible de lignes.
Dans la plupart des langages procéduraux au dessus de SQL, on
introduit une notion de “curseur” pour récupérer (et exploiter) les
résultats de requêtes.
Un curseur est une variable dynamique qui prend pour valeur le résultat
d’une requête. La méthode pour utiliser un curseur est invariable. En
premier lieu, celui-ci doit être défini (dans la zone de declaration).
30
30
15