create table test(
km varchar2(10), --会计科目
dzrq date, --登帐日期
jfje number(18,2), --借方金额
dfje number(18,2), --贷方金额
ye number(18,2) default 0 --余额
);
insert into test(km,jfje,dfje,dzrq) values('1',300,500,to_date('2006-01-01','yyyy-mm-dd'));
insert into test(km,jfje,dfje,dzrq) values('1',600,800,to_date('2006-01-02','yyyy-mm-dd'));
insert into test(km,jfje,dfje,dzrq) values('2',300,600,to_date('2006-01-01','yyyy-mm-dd'));
insert into test(km,jfje,dfje,dzrq) values('3',700,500,to_date('2006-01-01','yyyy-mm-dd'));
insert into test(km,jfje,dfje,dzrq) values('2',600,500,to_date('2006-01-02','yyyy-mm-dd'));
insert into test(km,jfje,dfje,dzrq) values('2',800,500,to_date('2006-01-03','yyyy-mm-dd'));
insert into test(km,jfje,dfje,dzrq) values('3',300,500,to_date('2006-01-02','yyyy-mm-dd'));
commit;
create or replace procedure p_test
is
cursor cur_mxz is
select rowid,km,dzrq,jfje,dfje,ye
from test
order by km,dzrq;
row_old cur_mxz%rowtype;
begin
row_old.km := 'initial km';
for row_mxz in cur_mxz loop
--if cur_mxz%rowcount>1 then
if row_mxz.km != row_old.km then
row_mxz.ye := row_mxz.jfje - row_mxz.dfje;
else
--大量带小数位的数据累加等于1数据库崩溃,oracle的bug,采用先乘100再除100回避
row_mxz.ye := round((row_old.YE * 100 + row_mxz.JFJE * 100 - row_mxz.DFJE * 100)/100, 2);
end if;
update test set ye = row_mxz.ye
where rowid = row_mxz.rowid;
row_old := row_mxz;
end loop;
commit;
exception
when others then
RAISE_APPLICATION_ERROR(-20000, '累加处理错误', TRUE);
end p_test;
/
exec p_test;
select * from test order by km,dzrq;
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18921899/viewspace-1016953/ ,如需转载,请注明出处,否则将追究法律责任。