it-swarm.it

Come rilevare e gestire solo specifiche eccezioni Oracle?

Da this e this suppongo che non ci siano eccezioni di sistema nominate predefinite per ORA-00955.

Come posso riscrivere quanto segue per rilevare solo l'errore ORA-00955?

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

A proposito, c'è qualche sintassi per rilevare gli errori semplicemente fornendo i codici di errore?

21
bernd_k

Hai due opzioni:


Fare riferimento all'eccezione direttamente per numero:

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; 

Un'altra opzione è utilizzare EXCEPTION_INIT Direttiva Pragma per associare un numero di errore Oracle noto all'eccezione definita dall'utente;

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; 

A proposito, c'è qualche sintassi per rilevare gli errori semplicemente fornendo i codici di errore?

Sì, l'ho dimostrato nel primo esempio

Ulteriori letture per variazioni su questo:

34
Sathyajith Bhat

Simile a quello che Sathya ha già suggerito, ma mi piace evitare when others completamente se possibile: un'eccezione non gestita è in genere il risultato corretto per le eccezioni che non stai gestendo in modo specifico:

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
*/