Les exceptions (ou erreurs d’exécution) PL/SQL peuvent provenir de défauts de conception, d’erreurs de développement, de défaillances matérielles ou encore de nombreuses autres sources. Bien qu’il ne soit pas possible d’anticiper chacune des exceptions possibles, il est possible d’écrire des gestionnaires d’exceptions (exception handlers) qui permettent à votre programme de continuer à fonctionner.
La gestion des exceptions se fait dans la section EXCEPTION
du bloc PL/SQL. Plusieurs gestionnaires d’exceptions peuvent être mis en place.
BEGIN ... EXCEPTION WHEN exception_1 THEN statements_1 WHEN exception_2 OR exception_3 THEN statements_2 WHEN OTHERS THEN statements_3 END;
Lorsqu’une exception est levée dans la section exécutable du bloc, l’exécution s’arrête et la section EXCEPTION
prend le relai. Si la section EXCEPTION
n’est pas définie, l’erreur levée est propagée à l’appelant : soit le bloc parent, soit l’environnement (SQL*Plus par exemple) si le bloc n’a pas de parent.
Les exceptions sont classées en trois catégories :
- Internally defined : déclarée et levée implicitement, elle possède un numéro mais pas forcément de nom ;
- Predefined : les exceptions les plus courantes se voient attribuer un nom (déclaré dans le package STANDARD) par PL/SQL afin de simplifier leur gestion ;
- User-defined : définies par l’utilisateur pour les besoins spécifiques de son application, elles doivent être levées manuellement.
Il existe une vingtaine d’exceptions prédéfinies dont voici la liste :
Exception prédéfinie | Erreur Oracle | SQLCODE |
---|---|---|
ACCESS_INTO_NULL | ORA-06530 | -6530 |
CASE_NOT_FOUND | ORA-06592 | -6592 |
COLLECTION_IS_NULL | ORA-06531 | -6531 |
CURSOR_ALREADY_OPEN | ORA-06511 | -6511 |
DUP_VAL_ON_INDEX | ORA-00001 | -1 |
INVALID_CURSOR | ORA-01001 | -1001 |
INVALID_NUMBER | ORA-01722 | -1722 |
LOGIN_DENIED | ORA-01017 | -1017 |
NO_DATA_FOUND | ORA-01403 | +100 |
NO_DATA_NEEDED | ORA-06548 | -6548 |
NOT_LOGGED_ON | ORA-01012 | -1012 |
PROGRAM_ERROR | ORA-06501 | -6501 |
ROWTYPE_MISMATCH | ORA-06504 | -6504 |
SELF_IS_NULL | ORA-30625 | -30625 |
STORAGE_ERROR | ORA-06500 | -6500 |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | -6533 |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | -6532 |
SYS_INVALID_ROWID | ORA-01410 | -1410 |
TIMEOUT_ON_RESOURCE | ORA-00051 | -51 |
TOO_MANY_ROWS | ORA-01422 | -1422 |
VALUE_ERROR | ORA-06502 | -6502 |
ZERO_DIVIDE | ORA-01476 | -1476 |
Vous pouvez retrouver l’ensemble des erreurs internes d’Oracle dans la documentation de l’éditeur.