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é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.

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\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\Notepad++\notepad++.exe'