Второе «исключение, когда другие» терпят неудачу - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь использовать ИСКЛЮЧЕНИЕ, КОГДА ДРУГИЕ для перехвата несуществующих таблиц, которые я пытаюсь УДАЛИТЬ, следующим образом:

begin
execute immediate 'drop table X';
exception when others then null;
end;

Если таблица x существует, и я запускаю ее, таблица удаляется, и всехорошо.Если я запустлю его снова, таблица не будет удалена, но из-за ИСКЛЮЧЕНИЯ сценарий будет выполняться успешно.Все идет нормально.

Проблема возникает, если я пытаюсь сделать это более одного раза.

Если я запускаю этот скрипт для удаления таблиц X и Y:

begin
execute immediate 'drop table X';
exception when others then null;

execute immediate 'drop table Y';
exception when others then null;
end;

Я получаю следующееинформация об ошибке:

Ошибка запуска в строке: 1 в команде -

begin
execute immediate 'drop table X';
exception when others then null;

execute immediate 'drop table Y';
exception when others then null;
end;

Отчет об ошибке - ORA-06550: строка 6, столбец 1: PLS-00103: Обнаружен символ «ИСКЛЮЧЕНИЕ»при ожидании одного из следующих действий:

(начинайте регистр, объявляйте конец, завершайте для goto, если цикл mod null прагма повышение поднимает возвращение выберите обновление, когда при нажатии << продолжить закрыть текущий удалить выборку заблокировать вставить вставить открытый откат сохранить точку сохранения set sql execute commit forallочистка канала слияния ORA-06550: строка 7, столбец 4: PLS-00103: Обнаружен символ «конец файла» при ожидании одного из следующих действий: </p>

конец, не прагма, конечный экземплярный порядок, переопределяющий статический конструктор элементакарта 06550. 00000 - «строка% s, столбец% s: \ n% s» * Причина: обычно ошибка компиляции PL / SQL. * Действие:

Что мне здесь не хватает? Если я удалил второйИСКЛЮЧЕНИЕ КОГДА-ЛИСценарий завершается ошибкой, если таблица Y не существует ... Мне нужно отловить эту ошибку ...

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я нашел свой ответ здесь:

Два оператора PLSQL с началом и концом, работают нормально отдельно, но не вместе?

Очевидно, мне нужно

begin
    begin
        some stuff
    end;
    begin
        some other stuff
    end;
end;

или поставить / после каждого из двух внутренних блоков END;«S ...

0 голосов
/ 11 октября 2018

exception when others then null; применяется к одному начальному / конечному блоку.Неверно иметь несколько магазинов в одном блоке.Вы можете обойти это, имея несколько отдельно взятых блоков.

begin
execute immediate 'drop table X';
exception when others then null;
end;
/

begin
execute immediate 'drop table Y';
exception when others then null;
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...