Vous êtes sur la page 1sur 11

Programmer avec  Avertissement : cette partie du cours nest

quun survol du langage PL/SQL, utile pour


PL/SQL crire des procdures stockes simples
 Elle laisse de ct de nombreuses
cole Suprieure de la Statistique et de lAnalyse de
lInformation (ESSAI)
fonctionnalits du langage

Fatma CHAKER KHARRAT


1 Support de cours PL/SQL F.CHAKER KHARRAT 2 Support de cours PL/SQL F.CHAKER KHARRAT

1. Introduction 1.1 Quest ce que PL/SQL

SQL : Est un langage ensembliste et non procdural. Les


traitements complexes sont parfois difficiles crire si on ne
1.1 Quest ce que PL/SQL peut utiliser des variables et les structures de programmation
comme les boucles et les alternatives
1.2 Fonctionnalits de PL/SQL
PL/SQL : Est un langage procdural, qui intgre
des ordres SQL de gestion de la base de donnes

3 Support de cours PL/SQL F.CHAKER KHARRAT 4 Support de cours PL/SQL F.CHAKER KHARRAT

1.2 Fonctionnalits de PL/SQL 1.2 Fonctionnalits de PL/SQL

 Instructions SQL intgres dans PL/SQL :


 PL/SQL est un langage algorithmique complet.  La partie LID (select)
 La partie LMD (insert, update, delete)
PL/SQL ne comporte pas dinstructions du LDD  La partie gestion de transactions (commit, rollback, savepoint,
(ALTER, CREATE, RENAME) ni les instructions de ...)
contrle comme GRANT et REVOKE.  Les fonctions (to_char, to_date, upper, substr, round, ...)

 PL/SQL est un lanage au mme titre que SQL. + Une partie procdurale (IF, WHILE, )

 Tout comme SQL, PL/SQL peut tre utilis au sein des outils  Instructions spcifiques PL/SQL :
de la famille Oracle comme : Sql*Plus, Sql*Forms, Sql*Pro, ....  Dfintion de variables
 Traitements conditionnels
 Traitements rptitifs
 Traitement des curseurs
5 Support de cours PL/SQL F.CHAKER KHARRAT 6
 Traitement des erreurs
Support de cours PL/SQL F.CHAKER KHARRAT
2. Le Bloc PL/SQL 2.1 Structure dun bloc PL/SQL

DECLARE

- - Dclaration de variables, constantes, exceptions


2.1 Structure dun bloc PL/SQL
BEGIN
2.2 Exemple - - Les instructions excuter (commandes excutables, instructions SQL et

PL/SQL, Possibilit de blocs fils (imbrication de blocs))

EXCEPTION

- - Traitement des exceptions (gestion des erreurs) Seuls BEGIN et


Les blocs, comme les instructions END sont obligatoires
se terminent par un ;

END ;
7 Support de cours PL/SQL F.CHAKER KHARRAT 8 Support de cours PL/SQL F.CHAKER KHARRAT

2.2 Exemple 3. Les Variables


Fichier de commandes : controle_stock :
INSERT INTO vente
DECLARE VALUES (:commande.produit ||vendu, 3.1 Types de variables
qte_stock NUMBER(5) SYSDATE);
BEGIN ELSE 3.2 Dclaration de variables
SELECT quantite INTO qte_stock INSERT INTO commande
FROM stock VALUES (:commande.produit ||demande 3.3 Initialisation des variables
WHERE produit = :commande.produit; SYSDATE);
-- Contrler et mettre jour le stock END IF; 3.4 Visibilit des variables
IF qte_stock > 0 COMMIT;
THEN UPADTE stock END;
SET quantite = quantite - 1 /
WHERE produit = :commande.produit;
9 Support de cours PL/SQL F.CHAKER KHARRAT 10 Support de cours PL/SQL F.CHAKER KHARRAT

3. Les variables 3.1 Types de variables

 Identificateurs Oracle :
30 caractres au plus
commence par une lettre
peut contenir lettres, chiffres, _, $ et #
 Pas sensible la casse
 Porte habituelle des langages blocs
 Doivent tre dclares avant dtre utilises

11 Support de cours PL/SQL F.CHAKER KHARRAT 12 Support de cours PL/SQL F.CHAKER KHARRAT
3.1 Types de variables 3.2 Dclaration de variables

Les variables locales se dfinissent dans la partie DECLARE dun bloc PL/SQL.
 Les types habituels correspondants aux types identificateur [CONSTANT] type [:= valeur];
SQL2 ou Oracle : integer, varchar,
 VARIABLES PL/SQL de type oracle :
Exemple :
 Types composites adapts la rcupration des DECLARE
colonnes et lignes des tables SQL : nom CHAR(15);
Dclarations multiples interdites :
%TYPE, %ROWTYPE numero NUMBER;
date_jour DATE; i,j : integer;
salaire NUMBER(7,2);
 Type rfrence : REF BEGIN
..
END;
13 Support de cours PL/SQL F.CHAKER KHARRAT 14 Support de cours PL/SQL F.CHAKER KHARRAT

3.2 Dclaration de variables 3.2 Dclaration de variables

 VARIABLES faisant rfrence au dictionnaire de donnes :


 VARIABLES PL/SQL de type boolen :
 Variables reprenant le mme type quune colonne dans la table :
Exemple :
Syntaxe :
DECLARE
reponse BOOLEAN := true ; Nom_variable table.colonne%TYPE ;
BEGIN
Exemple :
..
END; DECLARE
nom emp.ename%TYPE ;
BEGIN
..
15 Support de cours PL/SQL F.CHAKER KHARRAT END; 16 Support de cours PL/SQL F.CHAKER KHARRAT

3.2 Dclaration de variables 3.2 Dclaration de variables

 Variables reprenant la mme structure quune ligne dune table :  Variables de mme type quune variable prcdemment dfinie :
Syntaxe :
Syntaxe :
nom_variable table%ROWTYPE ; nom_variable2 nom_variable1%TYPE ;
Exemple :
Chaque variable de la structure Exemple :
DECLARE Enreg a le mme nom et le
mme type que la colonne associe
enreg emp%ROWTYPE ; DECLARE
BEGIN commi NUMBER(7,2) ;
.. salaire commi%TYPE ;
END;
Enreg BEGIN
..
END;
Enreg.empno Enreg.ename Enreg.deptno
17 Support de cours PL/SQL F.CHAKER KHARRAT 18 Support de cours PL/SQL F.CHAKER KHARRAT
3.3 Initialisation des variables 3.3 Initialisation des variables

 Linitialisation dune variable peut se faire par :  Loprateur :=


DECLARE
nom CHAR(10) := Ben Amor ;
 Loprateur := dans les sections DECLARE, BEGIN et EXCEPTION
salaire NUMBER(7,2) := 1500 ;
reponse BOOLEAN := TRUE ;
 Lordre SELECT INTO . dans la section BEGIN BEGIN
.
 Le traitement dun curseur dans la section BEGIN END;

Figer laffectation de valeur une variable avec la clause CONSTANT.


 Une variable est visible dans le bloc o elle a t dclare et dans les blocs
DECLARE
imbriqus si elle na pas t redfinie. pi CONSTANT NUMBER(7,2) := 3.14 ;
BEGIN
.
19 Support de cours PL/SQL F.CHAKER KHARRAT 20 Support de cours PL/SQL F.CHAKER KHARRAT
END ;

3.3 Initialisation des variables 3.3 Initialisation des variables

 Lordre SELECT

Interdire les valeurs non renseignes avec la clause NOT NULL Syntaxe :

DECLARE SELECT col1, col2 INTO var1, var2 FROM table [WHERE condition ] ;
i NUMBER NOT NULL := 1000 ;
La clause INTO est OBLIGATOIRE.
BEGIN
. Le SELECT doit obligatoirement ramener une ligne et une seule
END ; sinon erreur.
Pour traiter un ordre SELECT qui permet de ramener plusieurs lignes,
on utilise un curseur.

21 Support de cours PL/SQL F.CHAKER KHARRAT 22 Support de cours PL/SQL F.CHAKER KHARRAT

3.3 Initialisation des variables 3.4 Visibilit des variables


DECLARE
compte NUMBER(5) ;
Exemple : credit_max NUMBER(9,2) ;
BEGIN compte (NUMBER)
DECLARE
. ; credit_max
nom_emp CHAR(15) ; DECLARE
salaire emp.sal%TYPE ; compte CHAR(20);
balance1 NUMBER(9,2) ;
commision emp.comm%TYPE ; BEGIN
nom_depart CHAR(15) ; . compte (CHAR)
END; balance1
BEGIN ..; credit_max
SELECT ename, sal, comm, dname DECLARE
balance2 NUMBER(9,2) ;
INTO nom_emp, salaire, commision, nom_depart BEGIN
FROM emp, dept . compte (NUMBER)
END; balance2
WHERE ename = Hammami AND emp.deptno=dept.deptno ; .. credit_max
.. END ;
END ; compte (NUMBER)
credit_max
23 Support de cours PL/SQL F.CHAKER KHARRAT 24 Support de cours PL/SQL F.CHAKER KHARRAT
4. Traitements Conditionnels 4.1 Dfinition et syntaxe

 IF condition THEN 
instructions; IF condition 1 THEN
4.1 Dfinition et syntaxe END IF; instructions 1;
ELSEIF condition 2 THEN
instructions 2;
4.2 Exemple  ELSEIF .
IF condition THEN
instructions 1; ELSE
ELSE instructions N;
instructions 2; END IF;
END IF;

25 Support de cours PL/SQL F.CHAKER KHARRAT 26 Support de cours PL/SQL F.CHAKER KHARRAT

4.2 Exemple 5. Traitements rptitifs

DECLARE
emploi CHAR(10)
nom CHAR(15) := Hammami ; 5.1 La boucle de base (LOOP)
mes CHAR(30) ;
BEGIN
SELECT job INTO emploi FROM emp WHERE ename=nom;
5.2 La boucle FOR
IF emploi IS NULL THEN mes := nom||na pas demploi;
ELSIF emploi = Commercial 5.3 La boucle WHILE
THEN UPDATE emp SET com = 1000 WHERE ename = nom;
mes := nom || commision modifie ;
ELSE UPDATE emp SET com = 0 WHERE ename = nom;
mes := nom || pas de commision ;
END IF ;
INSERT INTO resultat VALUES (mes) ;
COMMIT;
END;
27 Support de cours PL/SQL F.CHAKER KHARRAT 28 Support de cours PL/SQL F.CHAKER KHARRAT

5.1 La boucle de base 5.2 La boucle FOR


compteur varie de Sup
LOOP inf avec un pas de -1
instructions;
EXIT [WHEN condition]; FOR compteur IN [REVERSE] inf .. Sup LOOP
instructions; instructions;
END LOOP; END LOOP;

Exemple : Insrer les 10 premiers chiffres dans la table resultat. Exemple : Calcul de factorielle 9.
DECLARE
DECLARE
fact NUMBER := 1 ;
nbre NUMBER := 1 ;
BEGIN
BEGIN
FOR i IN 1..9
LOOP
LOOP
INSERT INTO resultat VALUES (nbre) ;
fact := fact * i ;
nbre := nbre + 1
END LOOP ;
EXIT WHEN nbre > 10 ;
INSERT INTO resultat
END LOOP ;
VALUES (fact, FACTORIELLE9);
END ;
29 Support de cours PL/SQL F.CHAKER KHARRAT END ; 30 Support de cours PL/SQL F.CHAKER KHARRAT
5.3 La boucle WHILE 6. Les Curseurs
Condition est une condition dexpressions au
moyen des opratuers <, >, =, !=, AND, OR,
LIKE,

WHILE condition LOOP


instructions; 6.1 Dfinition
END LOOP;
6.2 Les types de curseurs
Exemple : Reste de la division de 7324 par 9.
DECLARE
6.3 Les tapes dutilisation dun curseur explicite
reste NUMBER := 7324 ;
BEGIN
6.4 Les attributs dun curseur
WHILE reste >= 9
LOOP
6.5 La boucle FOR pour un curseur
reste := reste - 9 ;
END LOOP ;
INSERT INTO resultat
VALUES (reste,reste division de 7324 par 9 );
END;
31 Support de cours PL/SQL F.CHAKER KHARRAT 32 Support de cours PL/SQL F.CHAKER KHARRAT

6.1 Dfinition 6.2 Les types de curseurs

 Pour traiter une commande SQL, PL/SQL ouvre Le curseur explicite


une zone de contexte pour excuter la commande
et stocker les informations. Il est cr et gr par l'utilisateur pour traiter un ordre Select qui
ramne plusieurs lignes. Le traitement du select se fera ligne par
 Le curseur permet de nommer cette zone de ligne.
contexte, d'accder aux informations et
ventuellement de contrler le traitement.
 Cette zone de contexte est une mmoire de taille Le curseur implicite
fixe, utilise par le noyau pour analyser et Il est gnr et gr par le noyau pour les autres commandes
interprter tout ordre SQL.
SQL.
 Les statuts d'excution de l'ordre se trouvent
dans le curseur.

33 Support de cours PL/SQL F.CHAKER KHARRAT 34 Support de cours PL/SQL F.CHAKER KHARRAT

6.3 Les curseurs explicites 6.3 Les curseurs explicites

 Pour traiter les select qui renvoient plusieurs lignes L'utilisation d'un curseur pour traiter un ordre Select
ramenant plusieurs lignes, ncessite 4 tapes :
Ils doivent tre dclars
1. Dclaration du curseur
 Le code doit les utiliser explicitement avec les ordres OPEN, 2. Ouverture du curseur
FETCH et CLOSE 3. Traitement des lignes
4. Fermeture du curseur.
 Le plus souvent on les utilise dans une boucle dont on sort quand
Lattribut NOTFOUND du curseur est vrai

35 Support de cours PL/SQL F.CHAKER KHARRAT 36 Support de cours PL/SQL F.CHAKER KHARRAT
6.3.1 Dclaration dun curseur explicite 6.3.1 Dclaration dun curseur explicite

Dclaration
Tout curseur explicite utilis dans un bloc PL/SQL doit tre dclar dans Exemple :
la section DECLARE du bloc en donnant :
 Son nom DECLARE
 Lordre select associ CURSOR dept_10 IS
Select ename,Sal FROM emp
Syntaxe WHERE deptno = 10
ORDER BY sal;
BEGIN
CURSOR nom_curseur IS ordre_select;
;
;
END;

37 Support de cours PL/SQL F.CHAKER KHARRAT 38 Support de cours PL/SQL F.CHAKER KHARRAT

6.3.2 Ouverture dun curseur explicite 6.3.2 Ouverture dun curseur explicite

Ouverture Exemple :
Aprs avoir dclar le curseur , il faut louvrir pour faire excuter
lordre SELECT.
DECLARE
Louverture du curseur se fait dans la section BEGIN du bloc
CURSOR dept_10 IS
Select ename,Sal FROM emp
Syntaxe WHERE deptno = 10
ORDER BY sal;
BEGIN
OPEN nom_curseur; ;
OPEN dept_10;
;
END;

39 Support de cours PL/SQL F.CHAKER KHARRAT 40 Support de cours PL/SQL F.CHAKER KHARRAT

6.3.3 Traitement des lignes 6.3.3 Traitement des lignes

Exemple :
Traitement des lignes DECLARE
 Aprs lexcution du SELECT, les lignes ramenes sont traites une par CURSOR dept_10 IS
une. Select ename,sal FROM emp
WHERE deptno = 10
 La valeur de chaque colonne du SELECT doit tre stocke dans une ORDER BY sal;
variable rceptrice nom emp.ename%TYPE;
salaire emp.sal%TYPE;
BEGIN
Syntaxe OPEN dept_10;
LOOP
Fetch nom_curseur INTO liste_variables; FETCH dept_10 INTO nom, salaire;
IF salaire >2500 THEN
INSERT INTO resultat
VALUES (nom,salaire);
Le Fetch ramne une seule ligne la fois. END IF;
EXIT WHEN salaire = 5000;
Pour traiter n lignes, il faut prvoir une boucle END LOOP;
41 Support de cours PL/SQL F.CHAKER KHARRAT END;
42 Support de cours PL/SQL F.CHAKER KHARRAT
6.3.4 Fermeture du curseur 6.3.4 Fermeture du curseur

Exemple :
Fermeture DECLARE
Aprs le traitement des lignes,on ferme le curseur pour librer la CURSOR dept_10 IS Select ename,sal FROM emp
place mmoire WHERE deptno = 10
ORDER BY sal;
nom emp.ename%TYPE;
Syntaxe salaire emp.sal%TYPE;
BEGIN
OPEN dept_10;
CLOSE nom_curseur; LOOP
FETCH dept_10 INTO nom, salaire;
IF salaire >2500 THEN INSERT INTO resultat VALUES (nom,salaire);
END IF;
EXIT WHEN salaire = 5000;
END LOOP;
CLOSE dept_10;
END;

43 Support de cours PL/SQL F.CHAKER KHARRAT 44 Support de cours PL/SQL F.CHAKER KHARRAT

6.4 Les attributs dun curseur 6.4 Les attributs dun curseur

Attribut %FOUND
Les attributs dun curseur (implicite ou explicite) sont des
indicateurs sur ltat dun curseur
 Type: boolen
 %FOUND
 Syntaxe:
Dernire ligne traite
 %NOTFOUND
Curseur implicite : SQL%FOUND
Curseur explicite : nom_curseur%FOUND
 %ISOPEN Ouverture dun curseur

 %ROWCOUNT nombre de lignes


Si sa valeur est vrai donc le dernier FETCH a ramen une
traites ligne

45 Support de cours PL/SQL F.CHAKER KHARRAT 46 Support de cours PL/SQL F.CHAKER KHARRAT

6.4 Les attributs dun curseur 6.4 Les attributs dun curseur
Attribut %FOUND (Exemple) Attribut %NOTFOUND
DECLARE
CURSOR dept_10 IS Select ename,sal FROM emp
WHERE deptno = 10 ORDER BY sal;
 Type: boolen
nom emp.ename%TYPE;  Syntaxe:
salaire emp.sal%TYPE;
BEGIN Curseur implicite : SQL%NOTFOUND
OPEN dept_10; Curseur explicite : nom_curseur%NOTFOUND
FETCH dept_10 INTO nom, salaire;
WHILE dept_10%FOUND
LOOP Si sa valeur est vrai donc le dernier FETCH na pas
IF salaire >2500 THEN
INSERT INTO resultat VALUES (nom,salaire); ramen une ligne
END IF;
FETCH dept_10 INTO nom, salaire;
END LOOP;
CLOSE dept_10;
END; Support de cours PL/SQL F.CHAKER KHARRAT Support de cours PL/SQL F.CHAKER KHARRAT
47 48
6.4 Les attributs dun curseur 6.4 Les attributs dun curseur
Attribut %NOTFOUND (Exemple) Attribut %ISOPEN

DECLARE  Type: boolen


CURSOR dept_10 IS Select ename,sal FROM emp
WHERE deptno = 10 ORDER BY sal;  Syntaxe:
nom emp.ename%TYPE; Curseur implicite : SQL%ISOPEN
salaire emp.sal%TYPE;
BEGIN toujours FALSE car Oracle referme les curseurs aprs
OPEN dept_10; utilisation
LOOP
FETCH dept_10 INTO nom, salaire; Curseur explicite : nom_curseur%ISOPEN
EXIT WHEN DEPT_10%NOTFOUND;
IF salaire >2500 THEN INSERT INTO resultat VALUES (nom,salaire); Si sa valeur est vrai donc le curseur est ouvert
END IF;
END LOOP;
CLOSE dept_10;
END;
49 Support de cours PL/SQL F.CHAKER KHARRAT 50 Support de cours PL/SQL F.CHAKER KHARRAT

6.4 Les attributs dun curseur 6.4 Les attributs dun curseur
Attribut %ISOPEN (Exemple) Attribut %ROWCOUNT

DECLARE
CURSOR dept_10 IS  Type: numrique
Select ename,sal FROM emp WHERE deptno = 10 ORDER BY sal;
nom emp.ename%TYPE;  Syntaxe:
salaire emp.sal%TYPE;
BEGIN Curseur explicite : nom_curseur%ROWCOUNT.
IF NOT (dept_10%ISOPEN) THEN OPEN dept_10;
END IF;
Traduit la nime ligne ramene par le FETCH
LOOP
FETCH dept_10 INTO nom, salaire;
EXIT WHEN DEPT_10%NOTFOUND;
IF salaire >2500 THEN
INSERT INTO resultat VALUES (nom,salaire);
END IF;
END LOOP;
CLOSE dept_10;
END;

51 Support de cours PL/SQL F.CHAKER KHARRAT 52 Support de cours PL/SQL F.CHAKER KHARRAT

6.4 Les attributs dun curseur 6.4 Les attributs dun curseur

Attribut %ROWCOUNT (Exemple) Attribut %ROWTYPE

DECLARE
Cet attribut permet la dclaration implicite d'une structure dont les lments
CURSOR dept_10 IS sont d'un type identique aux colonnes ramenes par le curseur.
Select ename,sal FROM emp WHERE deptno = 10 ORDER BY sal;
nom emp.ename%TYPE; Syntaxe :
salaire emp.sal%TYPE;
BEGIN Dans la partie dclarative du bloc.
OPEN dept_10; CURSOR nomcurseur IS ordre_select;
LOOP
FETCH dept_10 INTO nom, salaire; nomrecord nomcurseur%Rowtype;
EXIT WHEN DEPT_10%NOTFOUND OR DEPT_10%ROWCOUNT>15 ;
IF salaire >2500 THEN INSERT INTO resultat VALUES (nom,salaire);
END IF;
Les lments de la structure sont identifis par :
END LOOP; nomrecord.nomcolonne
CLOSE dept_10;
END;
La structure est renseigne par le Fetch :
FETCH nomcurseur INTO nomrecord;
53 Support de cours PL/SQL F.CHAKER KHARRAT 54 Support de cours PL/SQL F.CHAKER KHARRAT
6.4 Les attributs dun curseur 6.5 Boucle FOR pour un curseur
Attribut %ROWTYPE (Exemple)
 Elle simplifie la programmation car elle vite dutiliser explicitement les
DECLARE
instructions OPEN, FETCH et CLOSE
CURSOR c1 IS Select ename,sal+NVL(comm,0) saltot FROM emp
WHERE deptno = 10 ORDER BY sal;  Elle dclare implicitement une variable de type row associe au
c1_rec c1%ROWTYPE;
BEGIN curseur.
OPEN c1;
LOOP
DECLARE
FETCH c1 INTO c1_rec;
CURSOR nom_curseur IS ordre_select;
EXIT WHEN c1%NOTFOUND
IF c1_rec.saltot >2500 THEN INSERT INTO resultat BEGIN
VALUES (c1_rec.ename, c1_rec.saltot); FOR nom_rec IN nom_curseur LOOP
END IF; /*--------------Traitements----------------*/
END LOOP; END LOOP;
CLOSE c1; END;
END;

55 Support de cours PL/SQL F.CHAKER KHARRAT 56 Support de cours PL/SQL F.CHAKER KHARRAT

6.5 Boucle FOR pour un curseur 7. Gestion des exceptions


Exemple :

DECLARE 7.1 Introduction


CURSOR dept_10 IS
Select ename,sal FROM emp WHERE deptno = 10 7.2 Les exceptions internes
ORDER BY sal;
BEGIN
7.3 Les exceptions utilisateurs
FOR nom_rec IN dept_10; Variable de type
LOOP dept_10%ROWTYPE
IF salaire >2500 THEN
INSERT INTO resultat VALUES (nom_rec.ename, nom_rec.sal);
END IF;
END LOOP;
END;

57 Support de cours PL/SQL F.CHAKER KHARRAT 58 Support de cours PL/SQL F.CHAKER KHARRAT

7.1 Introduction 7.1 Introduction

 Le mcanisme de gestion d'erreurs dans PL/SQL est appel On distingue 2 types d'erreurs ou d'exceptions :
gestionnaire des exceptions.  Erreur interne : dans ce cas la main est rendue directement au
 Il permet au dveloppeur de planifier sa gestion et systme environnant.
d'abandonner ou de continuer le traitement en prsence
 Anomalie dtermine par l'utilisateur.
d'une erreur.
 Il faut affecter un traitement appropri aux erreurs apparues La solution :
dans un bloc PL/SQL.  Donner un nom l'erreur (si elle n'est pas dj prdfinie),
 Dfinir les anomalies utilisateurs, leur associer un nom,
 Dfinir le traitement effectuer.
59 Support de cours PL/SQL F.CHAKER KHARRAT 60 Support de cours PL/SQL F.CHAKER KHARRAT
7.2 Les exceptions internes 7.2 Les exceptions internes

 Une erreur interne est produite quand un bloc PL/SQL viole Les exceptions fournies par Oracle sont regroupes dans ce tableau :
une rgle d'Oracle ou dpasse une limite dpendant du systme
d'exploitation.
 Les erreurs Oracle gnres par le noyau sont numrotes, or le
gestionnaire des exceptions de PL/SQL, ne sait que grer des
erreurs nommes.
 Pour cela PL/SQL a redfini quelques erreurs Oracle comme
des exceptions. Ainsi, pour grer d'autres erreurs Oracle,
l'utilisateur doit utiliser le gestionnaire OTHERS ou
EXCEPTION_INIT pour nommer ces erreurs.
61 Support de cours PL/SQL F.CHAKER KHARRAT 62 Support de cours PL/SQL F.CHAKER KHARRAT

7.2 Les exceptions internes 7.3 Les exceptions utilisateurs


Exemple:  PL/SQL permet l'utilisateur de dfinir ses propres exceptions.
 La gestion des anomalies utilisateur peut se faire dans un bloc PL/SQL en effectuant les
DECLARE oprations suivantes :
wsal emp.sal%type;
 Nommer l'anomalie (type exception) dans la partie DECLARE du bloc.
BEGIN
DECLARE
select sal into wsal from emp; Nom_ano EXCEPTION;
EXCEPTION  Dterminer l'erreur et passer la main au traitement appropri par la commande
RAISE.
WHEN TOO_MANY_ROWS then ... ;
BEGIN
-- grer erreur trop de lignes
WHEN NO_DATA_FOUND then ... ; ...
-- grer erreur pas de ligne
IF (condition_anomalie) THEN RAISE Nom_ano ;
WHEN OTHERS then ... ;
-- grer toutes les autres erreurs  Effectuer le traitement dfini dans la partie EXCEPTION du Bloc.
END ; EXCEPTION
WHEN (Nom_ano) THEN (traitement);
63 Support de cours PL/SQL F.CHAKER KHARRAT 64 Support de cours PL/SQL F.CHAKER KHARRAT

7.3 Les exceptions utilisateurs

Exemple :

DECLARE
salaire numeric(8,2);
salaire_trop_bas EXCEPTION;
BEGIN
SELECT sal INTO salaire FROM emp WHERE matr=50;
IF salaire < 300 THEN RAISE salaire_trop_bas;
END IF;
- - suite du bloc
EXCEPTION
WHEN salaire_trop_bas THEN ;
dbms_output.put_line(message);
END; Permet laffichage dun message
sur cran
65 Support de cours PL/SQL F.CHAKER KHARRAT