Wie kann ich nur bestimmte Oracle-Ausnahmen abfangen und behandeln?

20

Aus diesem und jenem Grund gibt es vermutlich keine vordefinierten Systemausnahmen für ORA-00955.

Wie kann ich Folgendes umschreiben, um nur den Fehler ORA-00955 abzufangen?

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

BTW Gibt es eine Syntax, um Fehler zu erkennen, indem nur die Fehlercodes angegeben werden?

bernd_k
quelle

Antworten:

33

Sie haben zwei Möglichkeiten:


Beziehen Sie sich auf die Ausnahme direkt nach Nummer:

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; 

Eine andere Möglichkeit ist die Verwendung der EXCEPTION_INITPragma-Direktive, um eine bekannte Oracle-Fehlernummer an eine benutzerdefinierte Ausnahme zu binden.

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 Gibt es eine Syntax, um Fehler zu erkennen, indem nur die Fehlercodes angegeben werden?

Ja, ich habe es im ersten Beispiel demonstriert

Weitere Lektüre für Variationen dazu:

Sathyajith Bhat
quelle
1
Kann ich nicht einfach gehen, ohne dass andere die Zeilen erhöhen?
bernd_k
@bernd_k ja, das machst du, es ist jedoch eine unbehandelte Ausnahme
Sathyajith Bhat 20.12.11
2
Fügen Sie bitte eine Erhöhung in Ihrem WENN ANDERE hinzu, wenn sqlcodeNICHT 955 ist =)
Vincent Malgrat
Möglicherweise möchte das OP noch andere Fehler auslösen. Ihr Ausnahmeblock "as is" verhält sich genau wie ein WHEN OTHERS THEN NULL. Ich denke, das OP möchte etwas genaueres und subtileres.
Vincent Malgrat
@VincentMalgrat Du hast recht.
Sathyajith Bhat
5

Ähnlich wie Sathya es bereits vorgeschlagen hat, aber ich vermeide es gerne, when otherswenn möglich , vollständig - eine nicht behandelte Ausnahme ist normalerweise das richtige Ergebnis für Ausnahmen, die Sie nicht speziell behandeln:

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
*/
Jack Douglas
quelle
Genau das habe ich aus Sathyas Vorschlägen selbst herausgearbeitet.
bernd_k