Oracle Составной триггер после игнорирования оператора, когда предложение - PullRequest
1 голос
/ 18 января 2020

У меня есть составной триггер, использующий предложение when. Мое предложение when работает, как и ожидалось, для оператора AFTER EACH ROW, но не для следующего AFTER STATEMENT. Если предложение WHEN не выполнено, AFTER EACH ROW не выполняется, но оператор AFTER остается. Есть ли способ убедиться, что предложение WHEN работает для всего триггера?

Я попытался обойти, просто добавив предложение WHEN в качестве оператора IF в AFTER STATEMENT, но у меня были проблемы с переменными Bind и ошибкой ORA 03113. Пример кода ниже:

  FOR UPDATE OF COL_X ON MY_TABLE
WHEN (nvl(new.var,'*') != '*')

COMPOUND TRIGGER

type t_table is table of TABLE.VAR%TYPE;
l_table t_table := t_table();
AFTER EACH ROW IS
BEGIN       
      l_table.extend();
      l_table(l_table.last) := :new.var;
END AFTER EACH ROW;
--The following OUTPUT is displayed even if WHEN is not me--
after statement is
begin
dbms_output.put_line('OUTPUT'); 
for i in l_table.first .. l_table.last
loop
    dbms_output.put_line('Run if Data in l_table');
end loop;
l_table.delete
end after statement
end;

1 Ответ

0 голосов
/ 18 января 2020

Обойти это невозможно; триггеры до и после операторов всегда будут срабатывать. Условие WHEN относится к столбцам (и только после обновления). Специфичные c столбцы недоступны на уровне выписки.

...