表象如下:
一、在一个表上有一个触发器,以前一直运行很好,而且正常。现在到十二月份却连续出现问题。触发器都没有任何改动。
二、触发器的工作原理为:当程序修改主表(触发器关联表)的某一字段“after update of sfs on a_yfd”触发器通过运算向另一个表插入运算后的值。
三、错误为插入的值计算错误。
下面为触发器的代码:
create or replace trigger a_fin_hx
after update of sfs on a_yfd
referencing old as old new as new
for each row
declare
s_jsj a_yfd.jsj%type:=:old.jsj;
s_fkzt a_yfd_zt.fkzt%type;
s_khlsh a_yfd.khlsh%type:=:old.khlsh;
s_acc a_wldw.acc_rec%type;
s_send a_wldw.sendedsurplus%type;
t_acc a_wldw.acc_rec%type;
t_send a_wldw.sendedsurplus%type;
t_sfs a_yfd.sfs%type:=:old.sfs;
n_sfs a_yfd.sfs%type:=:new.sfs;
i_lsh a_yfd.lsh%type:=:old.lsh;
s_ysk number(16,6);
s_date date;
ls_date varchar2(30);
n integer;
hxjl_id a_hxjl.lsh%type;
t_hk number(16,6);--a_hxjl.hk%type;
PRAGMA AUTONOMOUS_TRANSACTION;
begin
t_hk:=0;
select trunc(sysdate) into s_date from dual;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') into ls_date from dual;
select fkzt into s_fkzt from a_yfd_zt where lsh=:old.lsh;
select acc_rec into s_acc from a_wldw where lsh=s_khlsh;
select sendedsurplus into s_send from a_wldw where lsh=s_khlsh;
select count(*) into n from a_hxjl where hxsj=s_date and dwlsh=s_khlsh;
--valdate
if n<>0 then
begin
select hk into t_hk from a_hxjl where hxsj=s_date and dwlsh=s_khlsh;
if t_hk is null then
begin
t_hk:=0;
end;
end if;
end;
end if;
if s_acc is null then
s_acc:=0;
end if;
if s_send is null then
s_send:=0;
end if;
--reset the sendedsurplus
if s_fkzt<>'N' and t_sfs is not null then
begin
s_ysk:=s_jsj*t_sfs;
s_send:=s_send+s_ysk;
t_hk:=t_hk-s_ysk;
end;
end if;
--coount the sendedsurplus
s_ysk:=n_sfs*s_jsj;
t_hk:=t_hk+s_ysk;
if s_send>=(s_acc+s_ysk) then
begin
t_acc:=0;
t_send:=s_send-s_acc-s_ysk;
end;
else
begin
t_acc:=s_acc+s_ysk-s_send;
t_send:=0;
end;
end if;
--set thsj
update a_yfd_zt set thsj=ls_date where lsh=i_lsh;
--set the count and sendedsurplus
update a_wldw set acc_rec=t_acc,sendedsurplus=t_send where lsh=s_khlsh;
--record hxjl
select a_hxjl_id.nextval into hxjl_id from dual;
if n=0 then
insert into a_hxjl(lsh,dwlsh,hxsj,y_ysk,y_ye,hk)
values(hxjl_id,s_khlsh,s_date,t_acc,t_send,t_hk);
else
update a_hxjl set y_ysk=t_acc,y_ye=t_send,hk=t_hk where hxsj=s_date and dwlsh=s_khlsh;
end if;
--set the status
if s_fkzt<>'Y' then
update a_yfd_zt set fkzt='Y' where lsh=:old.lsh;
end if;
COMMIT;
end;
12 个解决方案
#1
原来是一直正常的。有没有其他原因呢?
前台程序是在网络中运行的。有没有网络原因?
前台程序是在网络中运行的。有没有网络原因?
#2
你的具体的出错位置在哪边??
#3
if n=0 then
insert into a_hxjl(lsh,dwlsh,hxsj,y_ysk,y_ye,hk)
values(hxjl_id,s_khlsh,s_date,t_acc,t_send,t_hk);
else
update a_hxjl set y_ysk=t_acc,y_ye=t_send,hk=t_hk where hxsj=s_date and dwlsh=s_khlsh;--这个地方在修改a_hxjl表的时候y_ysk的值不对另两个也不对
end if;
insert into a_hxjl(lsh,dwlsh,hxsj,y_ysk,y_ye,hk)
values(hxjl_id,s_khlsh,s_date,t_acc,t_send,t_hk);
else
update a_hxjl set y_ysk=t_acc,y_ye=t_send,hk=t_hk where hxsj=s_date and dwlsh=s_khlsh;--这个地方在修改a_hxjl表的时候y_ysk的值不对另两个也不对
end if;
#4
我想触发器的本身是没有错误的,已经运行了大半年了都没有错误。只是集中在这个月出现了很多错误。
#5
if条件再考虑一下,是否合适
#6
是不是数据库在运行了一段时间后需要整理?
现在发现在客户端对数据库进行查询的时候有一点慢。
现在发现在客户端对数据库进行查询的时候有一点慢。
#7
现在没有人吗?
#8
可能是你的表结构或者其他相关的程序有问题
把错误的信息全贴出来
把错误的信息全贴出来
#9
没有错误信息,就是将计算结果弄错了。
#10
to yuwenshen(彩鸟)
那有两个可能
1.触发器的程序逻辑有问题
2.导入的数据有问题
现在你发现是值错误 那么一定要查清楚是触发器计算导致的错误还是原始数据不正确导致的错误
知道这个以后才能针对问题进行修改
那有两个可能
1.触发器的程序逻辑有问题
2.导入的数据有问题
现在你发现是值错误 那么一定要查清楚是触发器计算导致的错误还是原始数据不正确导致的错误
知道这个以后才能针对问题进行修改
#11
To:baojianjun(包子)
那有两个可能
1.触发器的程序逻辑有问题 --应该不存在,以前一直使用没有问题。只是在这个月出问题
2.导入的数据有问题 --??从那里导入数据?不明白。
那有两个可能
1.触发器的程序逻辑有问题 --应该不存在,以前一直使用没有问题。只是在这个月出问题
2.导入的数据有问题 --??从那里导入数据?不明白。
#12
1\将后触发更改为前触发看看.
2\删除此表,然后重建,在重新建立触发器看看.
3\以上2点都不行,到处用户数据,删除用户,重新导入(90%以上情况下,这么处理好用)
2\删除此表,然后重建,在重新建立触发器看看.
3\以上2点都不行,到处用户数据,删除用户,重新导入(90%以上情况下,这么处理好用)
#1
原来是一直正常的。有没有其他原因呢?
前台程序是在网络中运行的。有没有网络原因?
前台程序是在网络中运行的。有没有网络原因?
#2
你的具体的出错位置在哪边??
#3
if n=0 then
insert into a_hxjl(lsh,dwlsh,hxsj,y_ysk,y_ye,hk)
values(hxjl_id,s_khlsh,s_date,t_acc,t_send,t_hk);
else
update a_hxjl set y_ysk=t_acc,y_ye=t_send,hk=t_hk where hxsj=s_date and dwlsh=s_khlsh;--这个地方在修改a_hxjl表的时候y_ysk的值不对另两个也不对
end if;
insert into a_hxjl(lsh,dwlsh,hxsj,y_ysk,y_ye,hk)
values(hxjl_id,s_khlsh,s_date,t_acc,t_send,t_hk);
else
update a_hxjl set y_ysk=t_acc,y_ye=t_send,hk=t_hk where hxsj=s_date and dwlsh=s_khlsh;--这个地方在修改a_hxjl表的时候y_ysk的值不对另两个也不对
end if;
#4
我想触发器的本身是没有错误的,已经运行了大半年了都没有错误。只是集中在这个月出现了很多错误。
#5
if条件再考虑一下,是否合适
#6
是不是数据库在运行了一段时间后需要整理?
现在发现在客户端对数据库进行查询的时候有一点慢。
现在发现在客户端对数据库进行查询的时候有一点慢。
#7
现在没有人吗?
#8
可能是你的表结构或者其他相关的程序有问题
把错误的信息全贴出来
把错误的信息全贴出来
#9
没有错误信息,就是将计算结果弄错了。
#10
to yuwenshen(彩鸟)
那有两个可能
1.触发器的程序逻辑有问题
2.导入的数据有问题
现在你发现是值错误 那么一定要查清楚是触发器计算导致的错误还是原始数据不正确导致的错误
知道这个以后才能针对问题进行修改
那有两个可能
1.触发器的程序逻辑有问题
2.导入的数据有问题
现在你发现是值错误 那么一定要查清楚是触发器计算导致的错误还是原始数据不正确导致的错误
知道这个以后才能针对问题进行修改
#11
To:baojianjun(包子)
那有两个可能
1.触发器的程序逻辑有问题 --应该不存在,以前一直使用没有问题。只是在这个月出问题
2.导入的数据有问题 --??从那里导入数据?不明白。
那有两个可能
1.触发器的程序逻辑有问题 --应该不存在,以前一直使用没有问题。只是在这个月出问题
2.导入的数据有问题 --??从那里导入数据?不明白。
#12
1\将后触发更改为前触发看看.
2\删除此表,然后重建,在重新建立触发器看看.
3\以上2点都不行,到处用户数据,删除用户,重新导入(90%以上情况下,这么处理好用)
2\删除此表,然后重建,在重新建立触发器看看.
3\以上2点都不行,到处用户数据,删除用户,重新导入(90%以上情况下,这么处理好用)