Oracle的维护和触发器问题

时间:2021-11-09 05:01:39
我在维护一个Oracle数据库遇到的问题
表象如下:
一、在一个表上有一个触发器,以前一直运行很好,而且正常。现在到十二月份却连续出现问题。触发器都没有任何改动。
二、触发器的工作原理为:当程序修改主表(触发器关联表)的某一字段“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;

#4


我想触发器的本身是没有错误的,已经运行了大半年了都没有错误。只是集中在这个月出现了很多错误。

#5


if条件再考虑一下,是否合适

#6


是不是数据库在运行了一段时间后需要整理?
现在发现在客户端对数据库进行查询的时候有一点慢。

#7


现在没有人吗?

#8


可能是你的表结构或者其他相关的程序有问题
把错误的信息全贴出来

#9


没有错误信息,就是将计算结果弄错了。

#10


to yuwenshen(彩鸟) 
那有两个可能
1.触发器的程序逻辑有问题
2.导入的数据有问题

现在你发现是值错误 那么一定要查清楚是触发器计算导致的错误还是原始数据不正确导致的错误
知道这个以后才能针对问题进行修改

#11


To:baojianjun(包子)
那有两个可能
1.触发器的程序逻辑有问题 --应该不存在,以前一直使用没有问题。只是在这个月出问题
2.导入的数据有问题       --??从那里导入数据?不明白。

#12


1\将后触发更改为前触发看看.
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;

#4


我想触发器的本身是没有错误的,已经运行了大半年了都没有错误。只是集中在这个月出现了很多错误。

#5


if条件再考虑一下,是否合适

#6


是不是数据库在运行了一段时间后需要整理?
现在发现在客户端对数据库进行查询的时候有一点慢。

#7


现在没有人吗?

#8


可能是你的表结构或者其他相关的程序有问题
把错误的信息全贴出来

#9


没有错误信息,就是将计算结果弄错了。

#10


to yuwenshen(彩鸟) 
那有两个可能
1.触发器的程序逻辑有问题
2.导入的数据有问题

现在你发现是值错误 那么一定要查清楚是触发器计算导致的错误还是原始数据不正确导致的错误
知道这个以后才能针对问题进行修改

#11


To:baojianjun(包子)
那有两个可能
1.触发器的程序逻辑有问题 --应该不存在,以前一直使用没有问题。只是在这个月出问题
2.导入的数据有问题       --??从那里导入数据?不明白。

#12


1\将后触发更改为前触发看看.
2\删除此表,然后重建,在重新建立触发器看看.
3\以上2点都不行,到处用户数据,删除用户,重新导入(90%以上情况下,这么处理好用)