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.

Gestion des exceptions en PL/SQL

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.

  1. Exceptions prรฉdรฉfinies
  2. 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.

PL/SQL dรฉclenche une exception

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.

PL/SQL dรฉclenche une 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

PL/SQL dรฉclenche une exception

PL/SQL dรฉclenche une exception

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

Rรฉsumez cet article avec :