Come rilevare e gestire solo specifiche eccezioni Oracle?


20

Da questo e questo , 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?

Risposte:


33

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 la EXCEPTION_INITdirettiva 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:


1
non posso andarmene senza quando gli altri sollevano le linee?
bernd_k,

@bernd_k sì, lo fai, ma è un'eccezione non gestita
Sathyajith Bhat,

2
Per favore, aggiungi un aumento nel QUANDO ALTRI quando sqlcodeNON è 955 =)
Vincent Malgrat,

L'OP potrebbe ancora voler far sorgere altri errori. Il blocco delle eccezioni "così com'è" si comporta esattamente come QUANDO ALTRO POI NULL. Penso che l'OP voglia qualcosa di un po 'più preciso e sottile.
Vincent Malgrat,

@VincentMalgrat Hai ragione.
Sathyajith Bhat,

5

Simile a quello che Sathya ha già suggerito, ma mi piace evitare when otherscompletamente se possibile - un'eccezione non gestita è di solito il risultato corretto per le eccezioni che non si stanno 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
*/

Questo è esattamente ciò che ho condensato dalle proposte di Sathyas.
bernd_k,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.