Gestion des exceptions dans Oracle PL/SQL (exemples)
Quโest-ce que la gestion des exceptions en PL/SQL ?
Une exception se produit lorsque le moteur PL/SQL rencontre une instruction qu'il ne peut pas exรฉcuter en raison d'une erreur survenant au moment de l'exรฉcution. Ces erreurs ne seront pas capturรฉes au moment de la compilation et ne devront donc รชtre traitรฉes qu'au moment de l'exรฉcution.
Par exemple, si le moteur PL/SQL reรงoit une instruction pour diviser n'importe quel nombre par ยซ 0 ยป, alors le moteur PL/SQL la lancera comme exception. L'exception n'est dรฉclenchรฉe qu'au moment de l'exรฉcution par le moteur PL/SQL.
Les exceptions empรชcheront le programme de s'exรฉcuter davantage, donc pour รฉviter une telle situation, elles doivent รชtre capturรฉes et traitรฉes sรฉparรฉment. Ce processus est appelรฉ gestion des exceptions, dans lequel le programmeur gรจre l'exception qui peut se produire au moment de l'exรฉcution.
Syntaxe de gestion des exceptions
Les exceptions sont gรฉrรฉes au niveau du bloc, c'est-ร -dire qu'une fois qu'une exception se produit dans un bloc, le contrรดle sortira de la partie d'exรฉcution de ce bloc. L'exception sera ensuite gรฉrรฉe dans la partie de gestion des exceptions de ce bloc. Aprรจs avoir traitรฉ l'exception, il n'est pas possible de renvoyer le contrรดle ร la section d'exรฉcution de ce bloc.
La syntaxe ci-dessous explique comment intercepter et gรฉrer l'exception.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the โexception 1 _nameโ' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
Explication de la syntaxe :
- Dans la syntaxe ci-dessus, le bloc de gestion des exceptions contient une sรฉrie de conditions WHEN pour gรฉrer l'exception.
- Chaque condition WHEN est suivie du nom de l'exception qui devrait รชtre dรฉclenchรฉe au moment de l'exรฉcution.
- Lorsqu'une exception est dรฉclenchรฉe au moment de l'exรฉcution, le moteur PL/SQL recherchera cette exception particuliรจre dans la partie gestion des exceptions. Il commencera ร partir de la premiรจre clause ยซ WHEN ยป et, sรฉquentiellement, il effectuera une recherche.
- S'il trouve la gestion d'exception pour l'exception qui a รฉtรฉ dรฉclenchรฉe, il exรฉcutera cette partie de code de gestion particuliรจre.
- Si aucune clause 'WHEN' n'est prรฉsente pour l'exception qui a รฉtรฉ dรฉclenchรฉe, alors le moteur PL/SQL exรฉcutera la partie 'WHEN OTHERS' (si prรฉsente). Ceci est commun ร toutes les exceptions.
- Aprรจs avoir exรฉcutรฉ l'exception, le contrรดle partiel sortira du bloc actuel.
- Une seule partie d'exception peut รชtre exรฉcutรฉe pour un bloc au moment de l'exรฉcution. Aprรจs l'avoir exรฉcutรฉ, le contrรดleur ignorera la partie restante de gestion des exceptions et sortira du bloc actuel.
Remarque : QUAND AUTRES doit toujours รชtre ร la derniรจre position de la sรฉquence. La partie de gestion des exceptions prรฉsente aprรจs WHEN OTHERS ne sera jamais exรฉcutรฉe car le contrรดle quittera le bloc aprรจs l'exรฉcution de WHEN OTHERS.
Types d'exceptions
Il existe deux types d'exceptions dans PL/SQL.
- Exceptions prรฉdรฉfinies
- Exception dรฉfinie par l'utilisateur
Exceptions prรฉdรฉfinies
Oracle a prรฉdรฉfini une exception commune. Ces exceptions ont un nom d'exception et un numรฉro d'erreur uniques. Ces exceptions sont dรฉjร dรฉfinies dans le package 'STANDARD' de Oracle. Dans le code, nous pouvons directement utiliser ces noms d'exception prรฉdรฉfinis pour les gรฉrer.
Ci-dessous les quelques exceptions prรฉdรฉfinies
| Exception | Code d'erreur | Raison de l'exception |
|---|---|---|
| ACCESS_INTO_NULL | ORA-06530 | Attribuer une valeur aux attributs des objets non initialisรฉs |
| CASE_NOT_FOUND | ORA-06592 | Aucune des clauses "WHEN" de l'instruction CASE n'est satisfaite et aucune clause "ELSE" n'est spรฉcifiรฉe. |
| COLLECTION_IS_NULL | ORA-06531 | Utiliser des mรฉthodes de collection (sauf EXISTS) ou accรฉder aux attributs de collection sur des collections non initialisรฉes |
| CURSOR_ALREADY_OPEN | ORA-06511 | Essayer d'ouvrir un curseur qui est dรฉjร ouvert |
| DUP_VAL_ON_INDEX | ORA-00001 | Stockage d'une valeur en double dans une colonne de base de donnรฉes contrainte par un index unique |
| INVALID_CURSOR | ORA-01001 | Opรฉrations de curseur illรฉgales comme la fermeture d'un curseur non ouvert |
| NUMรRO INVALIDE | ORA-01722 | La conversion du caractรจre en nombre a รฉchouรฉ en raison d'un caractรจre numรฉrique non valide |
| AUCUNE DONNรE DISPONIBLE | ORA-01403 | Lorsque l'instruction 'SELECT' contenant la clause INTO ne rรฉcupรจre aucune ligne. |
| ROW_MISMATCH | ORA-06504 | Lorsque le type de donnรฉes de la variable du curseur est incompatible avec le type de retour rรฉel du curseur |
| SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Faire rรฉfรฉrence ร la collection par un numรฉro d'index supรฉrieur ร la taille de la collection |
| SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Rรฉfรฉrencer la collecte par un numรฉro d'index hors de la plage lรฉgale (ex : -1) |
| TOO_MANY_ROWS | ORA-01422 | Lorsqu'une instruction 'SELECT' avec la clause INTO renvoie plus d'une ligne |
| VALUE_ERROR | ORA-06502 | Erreur arithmรฉtique ou de contrainte de taille (ex : attribuer une valeur ร une variable plus grande que la taille de la variable) |
| ZERO_DIVIDE | ORA-01476 | Diviser un nombre par '0' |
Exception dรฉfinie par l'utilisateur
In Oracle, autres que les exceptions prรฉdรฉfinies ci-dessus, le programmeur peut crรฉer sa propre exception et les gรฉrer. Ils peuvent รชtre crรฉรฉs au niveau d'un sous-programme dans la partie dรฉclaration. Ces exceptions sont visibles uniquement dans ce sous-programme. L'exception dรฉfinie dans la spรฉcification du package est une exception publique et elle est visible partout oรน le package est accessible.
syntaxe: Au niveau du sous-programme
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- Dans la syntaxe ci-dessus, la variable 'exception_name' est dรฉfinie comme type 'EXCEPTION'.
- Cela peut รชtre utilisรฉ de la mรชme maniรจre quโune exception prรฉdรฉfinie.
syntaxe:Au niveau de la spรฉcification du package
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- Dans la syntaxe ci-dessus, la variable 'nom_exception' est dรฉfinie comme type 'EXCEPTION' dans la spรฉcification du package de .
- Cela peut รชtre utilisรฉ dans la base de donnรฉes partout oรน le package 'package_name' peut รชtre appelรฉ.
PL/SQL dรฉclenche une exception
Toutes les exceptions prรฉdรฉfinies sont dรฉclenchรฉes implicitement chaque fois que l'erreur se produit. Mais les exceptions dรฉfinies par l'utilisateur doivent รชtre dรฉclenchรฉes explicitement. Ceci peut รชtre rรฉalisรฉ en utilisant le mot-clรฉ ยซ RAISE ยป. Cela peut รชtre utilisรฉ de lโune des maniรจres mentionnรฉes ci-dessous.
Si 'RAISE' est utilisรฉ sรฉparรฉment dans le programme, alors il propagera l'exception dรฉjร dรฉclenchรฉe au bloc parent. Seul le bloc d'exception peut รชtre utilisรฉ comme indiquรฉ ci-dessous.
CREATE [ PROCEDURE | FUNCTION ]
AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN
<Handler>
RAISE;
END;
Explication de la syntaxe :
- Dans la syntaxe ci-dessus, le mot clรฉ RAISE est utilisรฉ dans le bloc de gestion des exceptions.
- Chaque fois que le programme rencontre l'exception ยซ exception_name ยป, l'exception est gรฉrรฉe et se terminera normalement.
- Mais le mot-clรฉ 'RAISE' dans la partie gestion des exceptions propagera cette exception particuliรจre au programme parent.
Remarque : Lors de la levรฉe de l'exception au bloc parent, l'exception dรฉclenchรฉe doit รฉgalement รชtre visible au niveau du bloc parent, sinon Oracle gรฉnรฉrera une erreur.
- Nous pouvons utiliser le mot-clรฉ ยซ RAISE ยป suivi du nom de l'exception pour dรฉclencher cette exception particuliรจre dรฉfinie par l'utilisateur/prรฉdรฉfinie. Cela peut รชtre utilisรฉ ร la fois dans la partie exรฉcution et dans la partie gestion des exceptions pour dรฉclencher lโexception.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Explication de la syntaxe :
- Dans la syntaxe ci-dessus, le mot-clรฉ RAISE est utilisรฉ dans la partie exรฉcution suivi de l'exception ยซ exception_name ยป.
- Cela dรฉclenchera cette exception particuliรจre au moment de l'exรฉcution, et cela doit รชtre traitรฉ ou augmentรฉ davantage.
Exemple 1: Dans cet exemple, nous allons voir
- Comment dรฉclarer l'exception
- Comment dรฉclencher l'exception dรฉclarรฉe et
- Comment le propager au bloc principal
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line(โInside nested blockโ); Dbms_output.put_line(โRaising sample_exception from nested blockโ); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (โException captured in nested block. Raising to main blockโ); RAISE, END; BEGIN Dbms_output.put_line(โInside main blockโ); Dbms_output.put_line(โCalling nested blockโ); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (โException captured in main block'); END: /
Explication du code :
- Ligne de code 2: Dรฉclaration de la variable 'sample_exception' comme type EXCEPTION.
- Ligne de code 3: Dรฉclaration de la procรฉdure nested_block.
- Ligne de code 6: Impression de l'instruction ยซ ร l'intรฉrieur du bloc imbriquรฉ ยป.
- Ligne de code 7 : Impression de l'instruction ยซ Rising sample_exception from nested block ยป.
- Ligne de code 8 : Dรฉclenchement de l'exception ร l'aide de 'RAISE sample_exception'.
- Ligne de code 10 : Gestionnaire dโexceptions pour lโexception sample_exception dans le bloc imbriquรฉ.
- Ligne de code 11 : Impression de la dรฉclaration 'Exception capturรฉe dans un bloc imbriquรฉ. Montรฉe au bloc principal.
- Ligne de code 12 : Lever l'exception au bloc principal (se propageant au bloc principal).
- Ligne de code 15 : Impression de la dรฉclaration ยซ ร l'intรฉrieur du bloc principal ยป.
- Ligne de code 16 : Impression de l'instruction ยซ Appel du bloc imbriquรฉ ยป.
- Ligne de code 17 : Appel de la procรฉdure nested_block.
- Ligne de code 18 : Exception
- Ligne de code 19 : Gestionnaire dโexceptions pour sample_exception dans le bloc principal.
- Ligne de code 20 : Impression de la dรฉclaration ยซ Exception capturรฉe dans le bloc principal ยป.
Points importants ร noter dans Exception
- En fonction, une exception doit toujours soit renvoyer une valeur, soit augmenter davantage l'exception. autre Oracle lancera l'erreur ยซ Fonction renvoyรฉe sans valeur ยป au moment de l'exรฉcution.
- Les instructions de contrรดle des transactions peuvent รชtre donnรฉes au bloc de gestion des exceptions.
- SQLERRM et SQLCODE sont les fonctions intรฉgrรฉes qui donneront le message et le code d'exception.
- Si une exception n'est pas gรฉrรฉe, par dรฉfaut, toutes les transactions actives dans cette session seront annulรฉes.
- RAISE_APPLICATION_ERROR (- , ) peut รชtre utilisรฉ ร la place de RAISE pour gรฉnรฉrer l'erreur avec le code utilisateur et le message. Le code d'erreur doit รชtre supรฉrieur ร 20000 et prรฉfixรฉ par ยซ - ยป.
Rรฉsumรฉ
Aprรจs ce chapitre. vous devriez รชtre capable de travailler sur les aspects suivants de Pl SQL exceptions
- Gรฉrer les exceptions
- Dรฉfinir une exception
- Lever l'exception
- Propagation des exceptions





