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

来源:互联网 发布:微商加粉王软件下载 编辑:程序博客网 时间:2024/05/30 23:17

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

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

create or replace trigger TIB_STAGE  after insert on flow_instance_node    for each rowdeclare  -- 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 handlingexception    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
原创粉丝点击