【发布时间】:2020-01-17 21:52:03
【问题描述】:
我有一个使用 when 子句的复合触发器。对于 AFTER EACH ROW 语句,我的 when 子句按预期工作,但对于以下 AFTER STATEMENT 则没有。如果未满足 WHEN 子句,则 AFTER EACH ROW 未运行,但 AFTER 语句仍在运行。有没有办法确保 WHEN 子句适用于整个触发器?
我尝试通过在 AFTER STATEMENT 中添加 WHEN 子句作为 IF 语句来解决问题,但遇到了 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;
【问题讨论】:
-
没办法; before 和 after 语句触发器将始终触发。 WHEN 条件引用列(然后仅在更新时)。特定列在语句级别不可用。
-
@belayer:请回答。谢谢。
标签: oracle plsql database-trigger bind-variables