Як ловити та поводитися лише з окремими винятками Oracle?


20

З цього і цього я здогадуюсь, що для ORA-00955 немає заздалегідь визначених системних винятків з названими системами.

Як я можу переписати наступне, щоб знайти лише помилку ORA-00955?

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

BTW Чи є синтаксис, щоб вловлювати помилки, просто надаючи коди помилок?

Відповіді:


33

У вас є два варіанти:


Зверніться до виключення безпосередньо за номером:

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; 

Інший варіант - використовувати EXCEPTION_INITдирективу Pragma для прив’язки відомого номера помилки Oracle до визначеного користувачем винятку;

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 Чи є синтаксис, щоб вловлювати помилки, просто надаючи коди помилок?

Так, я це продемонстрував у першому прикладі

Подальше читання для варіантів цього:


1
не можу я просто піти без того, коли інші піднімають лінії?
bernd_k

@bernd_k так, ти це зробиш, це все
одно є неуспішним

2
Будь ласка, додайте підвищення у КОГО ДРУГИХ, коли sqlcodeНЕ 955 =)
Вінсент Малграт

ОП може все-таки захотіти, щоб виникли інші помилки. Ваш блок Винятку "як є" поводиться точно як КОЛИ ДРУГИХ НІЛЬ. Я думаю, що ОП хоче чогось більш точного і тонкого.
Вінсент Малграт

@VincentMalgrat Ти маєш рацію.
Сатьядхіт Бхат

5

Подібно до того, що вже запропонувала Сатья, але я люблю уникати, when othersякщо можливо, непоправний виняток, як правило, є правильним результатом для винятків, з якими ви конкретно не обробляєте:

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

Саме це я і скоротив із пропозицій Сатіаса.
bernd_k
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.