Vous êtes sur la page 1sur 7

Exception PL/SQL

PL/SQL traite toutes les erreurs qui se produisent dans un bloc, une procédure ou une
fonction anonyme comme des exceptions. Les exceptions peuvent avoir différentes causes
telles que des erreurs de codage, des bugs et même des pannes matérielles.

Il n'est pas possible d'anticiper toutes les exceptions potentielles, cependant, vous pouvez
écrire du code pour gérer les exceptions afin de permettre au programme de continuer à
s'exécuter normalement.

Le code que vous écrivez pour gérer les exceptions est appelé gestionnaire d’exceptions.

Un bloc PL/SQL peut avoir une section de gestion des exceptions, qui peut avoir un ou
plusieurs gestionnaires d'exceptions.

Voici la syntaxe de base de la section de gestion des exceptions :

BEGIN
-- executable section
...
-- exception-handling section
EXCEPTION
WHEN e1 THEN
-- exception_handler1
WHEN e2 THEN
-- exception_handler1
WHEN OTHERS THEN
-- other_exception_handler
END;

Dans cette syntaxe, e1, e2sont des exceptions.

Lorsqu'une exception se produit dans la section exécutable, l'exécution du bloc en cours


s'arrête et le contrôle est transféré à la section de gestion des exceptions.

Si l'exception e1s'est produite, le exception_handler1fichier s'exécute. Si l'exception e2s'est


produite, le exception_handler2s'exécute. Dans le cas où une autre exception surviendrait,
alors les other_exception_handlerexécutions.

Après l'exécution d'un gestionnaire d'exceptions, le contrôle est transféré à l'instruction


suivante du bloc englobant. S'il n'y a pas de bloc englobant, le contrôle revient à l'invocateur
si le gestionnaire d'exceptions se trouve dans un sous-programme ou un environnement
hôte (SQL Developer ou SQL*Plus) si le gestionnaire d'exceptions se trouve dans un
bloc anonyme .

1
Si une exception se produit mais qu'il n'y a pas de gestionnaire d'exception, alors l' exception
se propage , ce dont nous parlerons dans le didacticiel sur la propagation des exceptions non
gérées .

Exemples d'exceptions PL/SQL

Prenons quelques exemples de gestion des exceptions.

NO_DATA_FOUND Exemple d'exception PL/SQL

Le bloc suivant accepte un identifiant client en entrée et renvoie le nom du client :

DECLARE
l_name customers.NAME%TYPE;
l_customer_id customers.customer_id%TYPE := &customer_id;
BEGIN
-- get the customer name by id
SELECT name INTO l_name
FROM customers
WHERE customer_id = l_customer_id;

-- show the customer name


dbms_output.put_line('Customer name is ' || l_name);

END;
/

Si vous exécutez le bloc et entrez l'identifiant client comme zéro, Oracle générera l'erreur
suivante :

ORA-01403: no data found

Il ORA-01403 s'agit d'une exception prédéfinie.

Notez que la ligne suivante ne s'exécute pas du tout car le contrôle est transféré à la section
de gestion des exceptions.

dbms_output.put_line('Customer name is ' || l_name);

2
Pour émettre un message plus significatif, vous pouvez ajouter une section de gestion des
exceptions comme suit :

DECLARE
l_name customers.NAME%TYPE;
l_customer_id customers.customer_id%TYPE := &customer_id;
BEGIN
-- get the customer
SELECT NAME INTO l_name
FROM customers
WHERE customer_id = l_customer_id;

-- show the customer name


dbms_output.put_line('customer name is ' || l_name);

EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Customer ' || l_customer_id || ' does not exist');
END;
/

Si vous exécutez ce bloc de code et saisissez l'identifiant client 0, vous obtiendrez le message
suivant :

Customer 0 does not exist

Exemple d'exception PL/SQL TOO_MANY_ROWS

Tout d’abord, modifiez le bloc de code dans l’exemple ci-dessus comme suit et exécutez-le :

DECLARE
l_name customers.name%TYPE;
l_customer_id customers.customer_id%TYPE := &customer_id;
BEGIN
-- get the customer
SELECT name INTO l_name
FROM customers
WHERE customer_id <= l_customer_id;

-- show the customer name


dbms_output.put_line('Customer name is ' || l_name);

EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Customer ' || l_customer_id || ' does not exist');
END;
/

3
Deuxièmement, entrez l'identifiant client 10 et vous obtiendrez l'erreur suivante :

ORA-01422: exact fetch returns more than requested number of rows

Il s'agit d'une autre exception appelée TOO_MANY_ROWSqui n'a pas été gérée par le code.

Troisièmement, ajoutez le gestionnaire d'exception pour TOO_MANY_ROWS exception :

DECLARE
l_name customers.NAME%TYPE;
l_customer_id customers.customer_id%TYPE := &customer_id;
BEGIN
-- get the customer
SELECT NAME INTO l_name
FROM customers
WHERE customer_id > l_customer_id;

-- show the customer name


dbms_output.put_line('Customer name is ' || l_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Customer ' || l_customer_id || ' does not exist');
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('The database returns more than one customer');
END;
/

Enfin, si vous exécutez le code, saisissez 10 comme identifiant client. Vous verrez que le code
ne générera aucune exception et émettra le message suivant :

The database returns more than one customer

Catégories d'exceptions PL/SQL

PL/SQL comporte trois catégories d'exceptions :

• Les exceptions définies en interne sont des erreurs résultant de l'environnement de


base de données Oracle. Le système d'exécution déclenche automatiquement les
exceptions définies en interne. ORA-27102 (mémoire insuffisante) est un exemple
d'exceptions définies en interne. Notez que les exceptions définies en interne n'ont
pas de nom, mais un code d'erreur.
• Les exceptions prédéfinies sont des erreurs qui se produisent lors de l'exécution du
programme. Les exceptions prédéfinies sont des exceptions définies en interne
auxquelles PL/SQL a donné des noms, par
exemple NO_DATA_FOUND, TOO_MANY_ROWS.

4
• Les exceptions définies par l'utilisateur sont des exceptions personnalisées définies
par des utilisateurs comme vous. Les exceptions définies par l'utilisateur doivent être
déclenchées explicitement.

Codes d’erreur en Oracle

https://www.gladir.com/CODER/ORACLE/codeerreur.htm

Le tableau suivant illustre les différences entre les catégories d'exceptions.

Catégorie Définisseur A un code A un nom Élevé Élevé


d'erreur implicitement explicitement
Défini en Système Toujours Seulement si vous en Oui En option
interne d'exécution attribuez un
Prédéfini Système Toujours Toujours Oui En option
d'exécution
Défini par Utilisateur Seulement si Toujours Non Toujours
l'utilisateur vous en
attribuez un

Exceptions prédéfinies
PL/SQL fournit de nombreuses exceptions prédéfinies, qui sont exécutées lorsqu'une règle de
base de données est violée par un programme. Par exemple, l'exception prédéfinie
NO_DATA_FOUND est déclenchée lorsqu'une instruction SELECT INTO ne renvoie aucune
ligne. Le tableau suivant répertorie quelques-unes des exceptions prédéfinies importantes –

Erreur
Exception CODESQL Description
Oracle

Il est déclenché lorsqu'un objet nul se voit


ACCESS_INTO_NULL 06530 -6530
automatiquement attribuer une valeur.

Il est déclenché lorsqu'aucun des choix de la


CASE_NOT_FOUND 06592 -6592 clause WHEN d'une instruction CASE n'est
sélectionné et qu'il n'y a pas de clause ELSE.

5
Il est déclenché lorsqu'un programme tente
d'appliquer des méthodes de collecte autres
que EXISTS à une table ou un varray imbriqué
COLLECTION_IS_NULL 06531 -6531
non initialisé, ou que le programme tente
d'attribuer des valeurs aux éléments d'une table
ou d'un varray imbriqué non initialisé.

Il est déclenché lorsque des valeurs en double


DUP_VAL_ON_INDEX 00001 -1 sont tentées d'être stockées dans une colonne
avec un index unique.

Il est déclenché lorsque des tentatives sont


faites pour effectuer une opération de curseur
INVALID_CURSOR 01001 -1001
non autorisée, telle que la fermeture d'un
curseur non ouvert.

Il est déclenché lorsque la conversion d'une


NUMÉRO INVALIDE 01722 -1722 chaîne de caractères en nombre échoue car la
chaîne ne représente pas un nombre valide.

Il est déclenché lorsqu'un programme tente de


LOGIN_DENIED 01017 -1017 se connecter à la base de données avec un nom
d'utilisateur ou un mot de passe non valide.

AUCUNE DONNÉE Il est déclenché lorsqu'une instruction SELECT


01403 +100
DISPONIBLE INTO ne renvoie aucune ligne.

Il est déclenché lorsqu'un appel à la base de


NOT_LOGGED_ON 01012 -1012 données est émis sans être connecté à la base
de données.

Il est déclenché lorsque PL/SQL a un problème


PROGRAMME_ERREUR 06501 -6501
interne.

Il est déclenché lorsqu'un curseur récupère la


ROWTYPE_MISMATCH 06504 -6504 valeur d'une variable ayant un type de données
incompatible.

6
Il est déclenché lorsqu'une méthode membre
SELF_IS_NULL 30625 -30625 est invoquée, mais que l'instance du type
d'objet n'a pas été initialisée.

Il est déclenché lorsque PL/SQL manque de


STORAGE_ERROR 06500 -6500
mémoire ou que la mémoire est corrompue.

Il est déclenché lorsqu'une instruction SELECT


TOO_MANY_ROWS 01422 -1422
INTO renvoie plusieurs lignes.

Il est déclenché lorsqu'une erreur


VALUE_ERROR 06502 -6502 d'arithmétique, de conversion, de troncature ou
de contrainte de taille se produit.

Il est déclenché lorsqu'on tente de diviser un


ZÉRO_DIVIDE 01476 1476
nombre par zéro.

Vous aimerez peut-être aussi