Что происходит, когда ДО ВСТАВИТЬ ТРИГГЕР терпит неудачу в оракуле - PullRequest
2 голосов
/ 09 июля 2010

У меня есть небольшое сомнение относительно ПЕРЕД ВСТАВКОЙ TRIGGER в Oracle, мой триггер выглядит так:

CREATE OR REPLACE TRIGGER some_trigger BEFORE INSERT
ON some_table   REFERENCING NEW AS newRow  
FOR EACH ROW
DECLARE
some_var          number(25, 4);

BEGIN
-- do some stuff
    :newRow.some_column  :=some_var;

 exception
      when no_data_found then
  NULL;
    when others then
    NULL;
END;

Здесь обновление, которое я делаю для newRow.some_column, является необязательным, поэтому мое требованиечто даже триггер дает сбой, newRow должен быть вставлен в таблицу, и именно поэтому я поглощаю исключения.

Правильно ли мое предположение, что если я сожру исключение, newRow будет вставлен в таблицу во всех сценариях?

Спасибо, куча.

1 Ответ

3 голосов
/ 09 июля 2010

Ваша обработка исключений обеспечит успешную вставку, даже если у вас есть исключение в вашем триггере.

Некоторые мысли:

  1. Ваш текущий код не может вызвать исключение NO_DATA_FOUND.

  2. Вы действительно хотите, чтобы ваш код молчал с ошибкой?

  3. Почему вы ловите оба NO_DATA_FOUND и OTHERS и игнорируете оба? OTHERS тоже поймает NO_DATA_FOUND.

EDIT

Я бы просто поймал NO_DATA_FOUND и добавил хороший комментарий о том, почему вы можете молча игнорировать его в вашем случае.
Убедитесь, что ваш SELECT возвращает только одну строку, в противном случае TOO_MANY_ROWS тоже нужно обрабатывать.

Игнорирование OTHERS обычно считается плохой практикой. Ваш код может потерпеть неудачу, и вы никогда не заметите. Для этого есть новое Предупреждение компилятора .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...