关于触发器中表*发生了变化, 触发器/函数不能读它

       在使用oracle触发器的过程中出现了表*发生了变化, 触发器/函数不能读它的异常,这里主要只写关于造成异常的其中一种--变异表。

       以下是一个实例,代码如下:

create or replace trigger TIB_STAGE
  after insert on flow_instance_node  
  for each row
declare
  -- local variables here
    integrity_error  exception;
    errno            integer;
    errmsg           char(200);
    dummy            integer;
    found            boolean;
    v_dbid           char(50);
    v_pre_id         char(50);
    v_node_name      char(50);
begin
   --从v_pre试图中读取pre_id
   select p.PRE_ID into v_pre_id from v_pre p  where p.INSTANCE_ID = :new.instance_id;
   select t.node_name into v_node_name from v_flow_instance_node t where t.INSTANCE_ID = :new.instance_id and t.FLOW_NODE_ID = :new.flow_node_id;
   if(v_node_name = '承办登记') then
       v_node_name := '资料审查';
   end if;
   if(v_node_name = '结束') then
       v_node_name := '办件归档';
   end if;
   v_dbid := SYS_GUID();
   insert into cei_pre_time_use (dbid,pre_id,node_name,start_date,end_date)
                         values (v_dbid,v_pre_id,v_node_name,:new.start_date,:new.end_date);
   P_CHECK_ENT_PRE_STAGE_TYPE(v_dbid,v_node_name,:new.instance_id);
--  Errors handling
exception
    when integrity_error then
       raise_application_error(errno, errmsg);  
end TIB_STAGE;
 

        在以上SQL中,是要在flow_instance_node表插入数据后,将其中的一些数据插入到cei_pre_time_use表中,但是实际上在有数据插入到flow_instacne_node表中后,就会出现表flow_instance_node发生了变化, 触发器/函数不能读它。

    问题分析:

    出现以上异常是因为trigger中SQL语句不能进行读或者修改触发语句的任何变异表,包括触发表本身。变异表就是当前被DML语句修改的表,而对于数据库上的trigger(触发器)来说,变异表就是trigger在其上定义的表。   

    解决方案:

    仔细检查后,发现其中涉及到一个v_flow_instace_node的视图,该视图就是通过flow_instance_node表和另一个flow_node表关联的,而在以上代码中通过:new.instance 去关联v_flow_instacnce_node视图显然违反了以上变异表规则。放弃使用该视图,直接使用flow_node表去返出字段node_name后,异常消失。


        


       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值