Académique Documents
Professionnel Documents
Culture Documents
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.
BEGIN
-- executable section
...
-- exception-handling section
EXCEPTION
WHEN e1 THEN
-- exception_handler1
WHEN e2 THEN
-- exception_handler1
WHEN OTHERS THEN
-- other_exception_handler
END;
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 .
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;
END;
/
Si vous exécutez le bloc et entrez l'identifiant client comme zéro, Oracle générera l'erreur
suivante :
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.
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;
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 :
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;
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 :
Il s'agit d'une autre exception appelée TOO_MANY_ROWSqui n'a pas été gérée par le code.
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;
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 :
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.
https://www.gladir.com/CODER/ORACLE/codeerreur.htm
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
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é.
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.