web-dev-qa-db-fra.com

Comment intercepter et gérer uniquement des exceptions Oracle spécifiques?

D'après this et this je suppose qu'il n'y a aucune exception de système nommé prédéfinie pour ORA-00955.

Comment puis-je réécrire ce qui suit pour ne détecter que l'erreur ORA-00955?

begin
      EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
    Null;
end;

BTW Existe-t-il une syntaxe pour détecter les erreurs en fournissant simplement les codes d'erreur?

21
bernd_k

Vous avez deux options:


Reportez-vous directement à l'exception par son numéro:

BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    WHEN OTHERS THEN
      IF SQLCODE = -955 THEN
        NULL; -- suppresses ORA-00955 exception
      ELSE
         RAISE;
      END IF;
END; 

Une autre option consiste à utiliser EXCEPTION_INIT Directive Pragma pour lier un numéro d'erreur Oracle connu à une exception définie par l'utilisateur;

DECLARE
   name_in_use exception; --declare a user defined exception
   pragma exception_init( name_in_use, -955 ); --bind the error code to the above 
BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    when name_in_use then
       null; --suppress ORA-00955 exception
END; 

BTW Existe-t-il une syntaxe pour détecter les erreurs en fournissant simplement les codes d'erreur?

Oui, je l'ai démontré dans le premier exemple

Pour en savoir plus sur les variations à ce sujet:

34
Sathyajith Bhat

Similaire à ce que Sathya a déjà suggéré, mais j'aime éviter when others complètement si possible - une exception non gérée est généralement le résultat correct pour les exceptions que vous ne gérez pas spécifiquement:

create sequence foo;
/*
sequence FOO created.
*/
declare
  name_is_already_used_955 exception;
  pragma exception_init(name_is_already_used_955,-955);
begin
  execute immediate 'create sequence foo';
exception when name_is_already_used_955 then null;
end;
/
/*
anonymous block completed
*/