Académique Documents
Professionnel Documents
Culture Documents
PL /SQL
PL /SQL
Introduction
Bloc PL/SQL
Déclaration des variables
Structures de contrôle
Curseurs
Exceptions
Procédures et fonctions
Les packages
Triggers
Page 1
Introduction
Bloc PL/SQL
Page 2
Bloc PL/SQL
Une variable est visible dans le bloc où elle est déclarée et dans tous ses
sous-blocs.
Si une variable est déclarée dans un premier bloc et aussi dans un sous
bloc, la variable du bloc supérieur n’est plus visible dans le sous-bloc.
RETURN (valeur);
[ EXCEPTION ] [ EXCEPTION ] [ EXCEPTION ]
Page 3
DECLARATION DES VARIABLES
Scalaires
Enregistrements
Variables Zone subdivisée
Table ORACLE
Composites
Table PL/SQL
Table à une dimension (1 colonne)
Page 4
Déclaration des variables scalaires
2. Déclaration par copie du type de donnée:
PL/ SQL permet de déclarer un type de variable par copie. La variable fait
référence au même type qu’une colonne d’une table ou même type qu’une autre
variable.
Syntaxe:
Nom-de-variable nom_table.nom-colonne%type ;
ou
Nom-de-variable1 Nom-de-variable2%type ;
Exemple: DECLARE
Nom_client client.nom%type ;
X number (10,3) ;
Y X%type ;
3. Valorisation des variables: 3 possibilités:
Par l’opérateur d’affectation : :=
Par la clause Select….Into
Par le traitement d’un curseur dans la section BEGIN.
© Base de données Avancees / M.MOURCHID, 2022-2023
Page 5
Types de variables
Variable élémentaire
Variable décomposée
en plusieurs informations
Pointeur
Opérateurs PL/SQL
PL/SQL supporte les mêmes opérateurs que SQL
Page 6
Structures de contrôles
Structure alternative
IF …. THEN…. END IF
IF …. THEN…. ELSE … END IF
Itérations
LOOP ..
FOR i…….
WHILE
Branchement séquentiels
GOTO
NULL
Structure alternative
IF THEN
IF condition THEN
sequence_insts;
END IF
IF THEN ELSE
IF condition THEN
sequence_insts1;
ELSE
sequence_insts2;
END IF
IF THEN ELSIF
IF condition1 THEN
sequence_insts1;
ELSIF condition2 THEN
sequence_insts2;
ELSE
sequence_insts3;
END IF
Page 7
Structure alternative
Exemple:
if var1>10 then
var2:= var1+20;
elsif var1 between 7 and 8 then
var2:= 2* var1;
else
var2:=var1*var1;
end if
Itérations
LOOP-EXIT-WHEN-END
LOOP
…..
EXIT WHEN CONDITION ou EXIT
…..
END LOOP
Exemple:
i:= 1 ;
LOOP
i:= i +1 ;
EXIT WHEN i >= 10 ;
….
END LOOP
Page 8
Itérations
WHILE-LOOP-END
WHILE condition LOOP
…..
END LOOP
Exemple:
WHILE total<= 10000 LOOP
……..
SELECT salaire INTO S FROM employe WHERE……..
….
total:= total + S ;
END LOOP
Itérations
FOR-IN-LOOP-END
FOR compteur IN [ REVERSE] inf..sup LOOP
…..
END LOOP
Exemple:
FOR I IN 1..10 LOOP
J:= J* 3 ;
INSERT INTO T VALUES ( I, J );
END LOOP
Page 9
NULL
Résumé
Structures conditionnelles Structures conditionnelles
IF condition1 LOOP
--- ---
ELSIF condition2
EXIT [ WHEN condition(s) ]
---
---
ELSE EXIT ne peut être codé que dans une boucle
--- END LOOP
END IF
END LOOP
Boucles imbriquées Boucle avec - comptage
Page 10
Resume
DECLARE Partie déclarative (optionnelle) - déclaration de ressources pour le bloc • Variables, constantes, curseurs,
Les curseurs
Page 11
Curseur: définition
1x La déclaration du curseur
lie le curseur et une requête SQL CURSOR …
Ouverture du curseur
1x Exécution de la requête SQL
Chargement en mémoire + OPEN ...
contexte
FETCH ...
Accès séquentiel aux lignes
nx via des variables
Gestion d ’une boucle
1x Fermeture du curseur
Libération de la zone mémoire Curseur
CLOSE ...
acquise
Variables programme
Page 12
Curseur: définition
Curseur: déclaration
DECLARE
v_ville employe.ville%type :=‘Rabat’
CURSOR employe_rabat IS
SELECT numemp, nomemp FROM employe WHERE ville= v_ville;
Page 13
Curseur: déclaration
Curseur: déclaration
Page 14
Curseur: Ouverture
BEGIN
OPEN employe_rabat ;
………….
……………….. Si aucune ligne n’est lue
END ; OPEN ne déclenche pas d’exception
Le programme teste l’état du curseur
après le FETCH
Page 15
Curseur: accès aux données
Exemple: CREATE TABLE resultat ( nom varchar2(10), sal number (7,2))
DECLARE
CURSOR employe_rabat IS
SELECT nomemp, sal FROM employe WHERE ville= ‘ Rabat’ ;
nom employe.nomempl%TYPE ; Définition des variables réceptrices
salaire employe.sal %TYPE ; (FETCH)
BEGIN
OPEN employe_rabat;
FETCH employe_rabat INTO nom, salaire ;
WHILE employe_rabat%found LOOP
IF salaire >3000 THEN
INSERT INTO resultat VALUES ( nom, salaire) ;
END IF ;
FETCH employe_rabat INTO nom, salaire ; Lecture séquentielle
END LOOP;
CLOSE employe_rabat ;
END ;
© Base de données Avancees / M.MOURCHID, 2022-2023
Page 16
Curseur pour lire toute une ligne: L’attribut
%ROWTYPE
Page 17
Les attributs de curseur explicite
Les attributs d ’un curseur permettent de connaître l’état du curseur après exécution de la requête
Format d’utilisation
Nom_curseur% ATTRIBUT
Curseur implicite
Page 18
Utilisation simplifiée des curseurs
Curseur FOR LOOP remplace OPEN, FETCH et CLOSE.
Lorsque le curseur est invoqué, un enregistrement est
automatiquement créé avec les mêmes éléments de données que
ceux définies dans l’instruction select.
Exemple:
CREATE TABLE resultat ( nom varchar2(10), sal number (7,2))
DECLARE
CURSOR employe_rabat IS
SELECT nome, salaire FROM employe WHERE ville= ‘ Rabat’ ;
BEGIN
FOR enrg_e IN employe_rabat enrg_e :enregistrement décrit automatiquement
LOOP
IF enrg_e.salaire >3000 THEN
INSERT INTO resultat VALUES (enrg_e.nome, enrg_e.salaire) ;
END IF ; Ne pas coder les ordres
END LOOP; OPEN
FETCH
END ; CLOSE
© Base de données Avancees / M.MOURCHID, 2022-2023
Page 19
Curseur paramétré
Un curseur paramétré peuvent servir plusieurs fois avec des valeurs des
paramètres différentes.
On doit fermer le curseur entre chaque utilisation de paramètres
différents ( sauf si on utilise for qui ferme automatiquement le curseur)
Exemple:
DECLARE
CURSOR cur_employe( v_ville varchar2(20)) IS
SELECT nomemp, sal FROM employe WHERE ville= v_ville ;
BEGIN
FOR enrg_e IN cur_employe(´rabat´)
/* traitement*/
END LOOP;
FOR enrg_e IN cur_employe(´kenitra´)
/* traitement*/
END LOOP;
END ;
© Base de données Avancees / M.MOURCHID, 2022-2023
Curseur modifiable
Page 20
Curseur modifiable
Exemple:
DECLARE
Cursor C1 is
select nomemp, sal from employe for update of sal;
resC1 C1%rowtype;
BEGIN
Open C1;
Fetch C1 into resC1;
While C1%found Loop
If resC1.sal > 1500 then
update employe
set sal = sal * 1.1
where current of c1;
end if;
Fetch C1 into resC1;
end loop;
close C1 ;
END; /
© Base de données Avancees / M.MOURCHID, 2022-2023
Curseur modifiable
Exemple: ( suite )
Explications :
( ... For update of nom_colonne )
Il faut se réserver la ligne lors de la déclaration du curseur par le positionnement d'un
verrou d'intention .
( ... where current of c1 ; )
Il faut spécifier que l'on veut traiter la ligne courante au Fetch par la clause.
Page 21
Exceptions
Définition
Fonctionnement
Exemples
Page 22