oracle触发器中,为什么在这段代码会报异常呢?。。。。。。。。。。。。。。。
我要问的问题,写在下面的触发器里了,请大家多多指教
create or replace trigger tg_kfs_res
after insert on t_kfsample
for each row
declare
v_asy_time date;
v_goodorbad number;
v_fe2o3 number;
v_sio2 number;
v_al2o3 number;
v_cao number;
v_mgo number;
v_na2o number;
v_k2o number;
v_s number;
v_p number;
v_as number;
v_b number;
v_cr number;
v_cu number;
v_ni number;
v_mo number;
v_co number;
v_v number;
v_sn number;
v_ba number;
v_hg number;
v_count number;
v_delegate varchar2(9); --委托快分码
v_s_fe2o3 number;
v_s_sio2 number;
v_s_al2o3 number;
v_s_cao number;
v_s_mgo number;
v_s_na2o number;
v_s_k2o number;
v_s_s number;
v_s_p number;
v_s_as number;
v_s_b number;
v_s_cr number;
v_s_cu number;
v_s_ni number;
v_s_mo number;
v_s_co number;
v_s_v number;
v_s_sn number;
v_s_ba number;
v_s_hg number;
v_s_count number;
v_s_asy_time date;
v_s_goodorbad number;
v_sample_id varchar2(11);
v_seq varchar2(2);
v_num number;
--myexception exception;
v_s_id varchar2(12);
begin
--首先取出t_kfsample表中的记录
v_s_id :=:new.fd_sample_id;
--为什么执行下面这个查询语句就跑到exception那个地方去了呢,v_s_id 是有值的,而且根据这个v_s_id也是可以查到数据的 ,但是为什么会跳到异常里了呢?请教大家
select count(*) into v_count from t_kfsample where fd_sample_id=v_s_id;
if(v_count> 0) then
select fd_analy_time,fd_goodorbad ,fd_Fe2O3,fd_SiO2,fd_Al2O3,
fd_CaO,fd_MgO,fd_Na2O,fd_K2O,fd_S,fd_P,fd_As,fd_B,fd_Cr,
fd_Cu,fd_Ni,fd_Mo,fd_Co,fd_V,fd_Sn,fd_Ba,fd_Hg,fd_sample_id
into v_asy_time, v_goodorbad,v_fe2o3,v_sio2,v_al2o3,
v_cao,v_mgo ,v_na2o,v_k2o ,v_s , v_p, v_as,
v_b,v_cr,v_cu,v_ni,v_mo,v_co,v_v,v_sn,
v_ba,v_hg, v_delegate
from t_kfsample where FD_SAMPLE_ID=v_s_id;
if v_delegate is not null then
--取出t_sample 表中的记录
select count(*) into v_s_count from t_sample where fd_delegate=v_delegate;
if(v_s_count> 0) then
select fd_sample_id,fd_analy_time,fd_goodorbad ,fd_Fe2O3,fd_SiO2,fd_Al2O3,
fd_CaO,fd_MgO,fd_Na2O,fd_K2O,fd_S,fd_P,fd_As,fd_B,fd_Cr,
fd_Cu,fd_Ni,fd_Mo,fd_Co,fd_V,fd_Sn,fd_Ba,fd_Hg,fd_seq
into v_sample_id,v_s_asy_time, v_s_goodorbad,v_s_fe2o3,v_s_sio2,v_s_al2o3,
v_s_cao,v_s_mgo ,v_s_na2o,v_s_k2o ,v_s_s , v_s_p, v_s_as,
v_s_b,v_s_cr,v_s_cu,v_s_ni,v_s_mo,v_s_co,v_s_v,v_s_sn,
v_s_ba,v_s_hg,v_seq from t_sample where fd_delegate=v_delegate;
end if;
end if;
else
dbms_output.put_line( '没有找到该记录 ');
end if;
if v_delegate is not null then
v_num:=0;
select count(*)into v_num from t_send_buff where fd_sample_id=v_sample_id and fd_delegate=v_delegate;
if v_num <=0 then
insert into t_send_buff(fd_sample_id,fd_message_id, fd_delegate,fd_seq)
values(v_sample_id, '1B0F52 ',v_delegate,v_seq);
insert into t_send_buff(fd_sample_id,fd_message_id,fd_delegate,fd_seq)
values(v_sample_id, '1B0H51 ',v_delegate,v_seq);
end if;
end if;
commit ;
exception
when others then
dbms_output.put_line( '错误信息为: '|| sqlcode || ': ' || sqlerrm);
end tg_kfsample_insert;
[解决办法]
你这是犯了逻辑错误,发生了级联更新效应
[解决办法]
触发器中不能操作正在并发发生数据改变的表
[解决办法]
触发器中对本表的操作,只能操作本条记录,使用:NEW 或:OLD .字段
