变异,触发器/函数在使用触发器时可能看不到错误

Posted

技术标签:

【中文标题】变异,触发器/函数在使用触发器时可能看不到错误【英文标题】:mutating, trigger/function may not see it error while using Trigger 【发布时间】:2019-09-07 07:18:38 【问题描述】:

我有一个像 bugs_metadata 这样的表 创建表 bugs_metadata(REPORT_NAME varchar2(10), WHERE_CLAUSE varchar2(100)); 插入 bugs_metadata('test','29603754,29605708,29649865'); 在更新上表中的 WHERE_CLAUSE 列时,我在下面的触发器中收到“变异,触发器/函数可能看不到它”错误:

create or replace TRIGGER "c_b_c_b_update" AFTER  
    UPDATE ON bugs_metadata
    FOR EACH ROW 
BEGIN
CASE
  WHEN UPDATING('WHERE_CLAUSE') THEN
  IF :NEW.WHERE_CLAUSE is not null THEN 
    insert into bug_data(BUG_NUMBER,SUBJECT)
    select rptno,SUBJECT 
    from rpthead 
    where rptno in (select regexp_substr(:NEW.WHERE_CLAUSE,'[^,]+',1,level) WHERE_CLAUSE  
                    from bugs_metadata t2 
                    connect by regexp_substr(:NEW.WHERE_CLAUSE,'[^,]+',1,level) is not null ) 
      and rptno not in(select bug_number from bug_data);

  END IF;
  END CASE; 
END;

你能告诉我这里有什么问题吗?

【问题讨论】:

错误信息一目了然。您的触发器位于bugs_metadata 表上,并且还使用该表INSERT INOT bug_data ... SELECT ... WHERE ... bugs_metadata 您能否建议一种方法来克服这个问题并实现相同的功能。 您不应该使用您尝试构建触发器的bugs_metadata 表来形成您的查询。您可以将bugs_metadata 替换为dual。所以,考虑@Littlefoot 的回答。 【参考方案1】:

应该使用DUAL 而不是bugs_metadata。这样做没有问题,因为您只是将列拆分为行,因此无需使用实际表,因为该值已存在于 :new.where_clause 中。

查看--> right here --> 行,它标记了位置。

create or replace trigger c_b_c_b_update 
  after update on bugs_metadata
  for each row 
begin
  case
    when updating('WHERE_CLAUSE') then
      if :new.where_clause is not null then 
         insert into bug_data(bug_number, subject)
           select rptno, subject 
           from rpthead 
           where rptno in (select regexp_substr(:new.where_clause, '[^,]+', 1, level) 
--> right here -->         from dual
                           connect by regexp_substr(:new.where_clause, '[^,]+', 1, level) is not null
                          ) 
             and rptno not in (select bug_number 
                               from bug_data
                              );
      end if;
  end case; 
end;

【讨论】:

以上是关于变异,触发器/函数在使用触发器时可能看不到错误的主要内容,如果未能解决你的问题,请参考以下文章

错误触发器:表正在变异,触发器/函数可能看不到它

Oracle - 在没有触发器的情况下更新表时出现“表正在变异,触发器/函数可能看不到它”错误

表正在变异,触发器/函数可能看不到它;需要后/行级查询

如何修复 ORA-04091:表正在变异,触发器/函数可能看不到它?

ORA-04091: 表 [blah] 正在变异,触发器/函数可能看不到它

表正在变异,触发器可能看不到它