it-swarm-eu.dev

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

Von this und this denke ich, dass es für ORA-00955 keine vordefinierten Ausnahmen für benannte Systeme gibt.

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;

Übrigens: Gibt es eine Syntax zum Abfangen von Fehlern, indem nur die Fehlercodes angegeben werden?

21
bernd_k

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 Option ist die Verwendung von EXCEPTION_INIT Pragma-Anweisung zum Binden einer bekannten Oracle-Fehlernummer an eine benutzerdefinierte Ausnahme;

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; 

Übrigens: Gibt es eine Syntax zum Abfangen von Fehlern, indem nur die Fehlercodes angegeben werden?

Ja, ich habe es im ersten Beispiel demonstriert

Lesen Sie weiter für Variationen davon:

34
Sathyajith Bhat

Ähnlich wie Sathya bereits vorgeschlagen hat, aber ich vermeide gerne when others wenn 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
*/