Articles

Exceptions prédéfinies Oracle

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éfinieErreur OracleSQLCODE
ACCESS_INTO_NULLORA-06530-6530
CASE_NOT_FOUNDORA-06592-6592
COLLECTION_IS_NULLORA-06531-6531
CURSOR_ALREADY_OPENORA-06511-6511
DUP_VAL_ON_INDEXORA-00001-1
INVALID_CURSORORA-01001-1001
INVALID_NUMBERORA-01722-1722
LOGIN_DENIEDORA-01017-1017
NO_DATA_FOUNDORA-01403+100
NO_DATA_NEEDEDORA-06548-6548
NOT_LOGGED_ONORA-01012-1012
PROGRAM_ERRORORA-06501-6501
ROWTYPE_MISMATCHORA-06504-6504
SELF_IS_NULLORA-30625-30625
STORAGE_ERRORORA-06500-6500
SUBSCRIPT_BEYOND_COUNTORA-06533-6533
SUBSCRIPT_OUTSIDE_LIMITORA-06532-6532
SYS_INVALID_ROWIDORA-01410-1410
TIMEOUT_ON_RESOURCEORA-00051-51
TOO_MANY_ROWSORA-01422-1422
VALUE_ERRORORA-06502-6502
ZERO_DIVIDEORA-01476-1476

Vous pouvez retrouver l’ensemble des erreurs internes d’Oracle dans la documentation de l’éditeur.

Formation SQL

Oracle propose l’utilitaire SQL*Plus, disponible en ligne de commande ou client graphique pour Windows permettant d’exécuter des commandes. Trois types de commandes peuvent être utilisés :

  • SQL et PL/SQL pour manipuler les informations de la base de données ;
  • ou SQL*Plus pour le formatage de l’affichage et des rapports.

Cet outil génère un buffer SQL qui stocke la dernière commande SQL ou PL/SQL (mais pas SQL*Plus) utilisée. Le contenu du buffer peut être consulté grâce à la commande LIST (ou L) ou exécuté grâce aux commandes RUN (ou R) qui affiche puis exécute la commande ou / (slash) qui l’exécute directement.

Le contenu du buffer peut facilement être modifié avec la commande EDIT (ou ED), qui va ouvrir l’éditeur de texte par défaut de votre système d’exploitation. Par exemple, sous Windows, c’est le Bloc notes qui va s’ouvrir pour modifier vos requêtes.

Il est possible de changer l’éditeur de texte que vous souhaitez ouvrir avec la commande DEFINE.

Exemple sous Windows :

DEFINE _editor='C:\Program Files (x86)\Notepad++\notepad++.exe'

Exemple sous UNIX :

DEFINE _editor='vi'

Avec l’éditeur graphique, cela revient au même que de cliquer sur Edit > Editor > Define Editor... et de rentrer l’adresse complète de l’éditeur de son choix.

Cependant, ces deux solutions doivent être réalisées à chaque changement de session. Il est possible de lancer automatiquement cette commande lors du démarrage de SQL*Plus. Pour cela, il faut modifier le fichier glogin.sql (le « Default Site Profile Script »). Il est situé dans $ORACLE_HOME/sqlplus/admin/glogin.sql pour UNIX, et %ORACLE_HOME%\sqlplus\admin\glogin.sql sous Windows.

Il suffit ensuite de rajouter la commande suivante dans le corps du script :

-- Define the default editor we want
DEFINE _editor='C:\Program Files (x86)\Notepad++\notepad++.exe'