语句后忽略When子句的Oracle复合触发器

Posted

技术标签:

【中文标题】语句后忽略When子句的Oracle复合触发器【英文标题】:Oracle Compound Trigger After Statement Ignoring When Clause 【发布时间】: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:请回答。谢谢。 【参考方案1】:

没有办法解决; before 和 after 语句触发器将始终触发。 WHEN 条件引用列(然后仅在更新时)。特定列在语句级别不可用。

【讨论】:

以上是关于语句后忽略When子句的Oracle复合触发器的主要内容,如果未能解决你的问题,请参考以下文章

Oracle的PL_SQL的异常处理

具有多个 when 子句的 HSQL 触发器

Oracle中触发器有几种,用法与SQL Server一样吗?谢谢

oracle_触发器

Oracle触发器

基本 Oracle 触发器审计表