在使用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后,异常消失。