使用游标将多行查询结果逐行处理
二、接下来这个程序是我运用游标功能,编写的计算定期存款应付利息的程序。
该程序由两个存储过程组成,需要调用定期存款表(t_dqcd)和利率表(t_ll)的数据,由于每笔存款金额、存期、适用利率、开户日不同,在进行计算定期存款应付利息时,只能按户逐笔进行。
第一个存储过程主要是执行游标操作语句,提出输入参数“帐号”,并调用存储过程“单帐号应付利息”,得出输出参数“单帐户利息值”,并对其进行累加,直到算出所有帐户的应付利息。
具体程序如下:
print 'install yflx.....'
go
drop proc yflx
go
create proc yflx
@we money output
as declare c1 cursor for /*说明游标C1 */
select wh from t_dqcd where zhzt <> '1'
declare @iwh char(9)
declare @wh char(9)
declare @hzs char(12)
declare @ff money
declare @jj money open c1 /*打开游标*/ select @jj = 0.00 /*赋初值为0*/ fetch c1 into @iwh /*提出游标数据给变量*/
while @@sqlstatus != 2
begin
if @@sqlstatus =1
begin
raiserror 20001 "select fail"
return
end exec dhlx @wh=@iwh,@dhlx=@ff output/*调动存储过程*/
select @jj = @jj + @ff
fetch c1 into @iwh
end select @we = @jj/*将汇总数付给输出变量*/ close c1/*关闭游标*/ deallocate cursor c1/*删除游标*/
go
第二个存储过程主要根据游标所提取的帐号运用sql查询语句,算出实际存期和当时挂牌利率,最终算出该帐户的应付利息。
计算公式为:
未到期定期储蓄存款
应付利息=本金×实际天数×存入时挂牌利率
逾期定期储蓄存款
应付利息=本金×存期×存入入时挂牌利率+本金×逾期天数×现行活期挂牌利率
具体程序如下:
print 'install dhlx .....'
go
drop proc dhlx
go
create proc dhlx
@wh char(9),
@dhlx money output
as
declare @ts smallint
declare @yflx money
declare @cts char(9)
declare @hqll float
declare @bcc char(5)
declare @zhbcc char(2)
declare @sbcc smallint
declare @khrq smallint
select @bcc=bcc from t_dqcd where wh=@wh
select @zhbcc=substring(@bcc,3,2)
select @sbcc= convert(int,@zhbcc)
select @ts=(datediff(mm,(select qxr from t_dqcd where wh =@wh),
getdate())*30 + datepart(dd,getdate()) -
datepart(dd, (select qxr from t_dqcd where wh=@wh)))
from t_dqcd where wh=@wh /*计算实际存取天数*/
select @cts = convert(char, @ts)
select @hqll=ll from t_ll where bcc='12000'
and rq=(select max(rq) from t_ll)
if @ts < @sbcc*30/*检查该存款是否到期*/
select @yflx=round(((select bjje from t_dqcd where wh=@wh)*
(select ll from t_ll where bcc=(select bcc from t_dqcd where wh=@wh)
and rq=(select max(rq) from t_ll where bcc=(select bcc from t_dqcd
where wh =@wh) and rq !> (select khr from t_dqcd where wh=@wh)))*(
datediff(mm,(select qxr from t_dqcd where wh=@wh),
getdate())*30 + datepart(dd,getdate()) - datepart
(dd,(select qxr from t_dqcd where wh=@wh)))/30000),2)
from t_dqcd where wh=@wh
else
select @yflx=round((((select bjje from t_dqcd where wh=@wh)*
(select ll from t_ll where bcc=(select bcc from t_dqcd where wh=@wh)
and rq=(select max(rq) from t_ll where bcc=(select bcc from t_dqcd
where wh =@wh) and rq !> (select qxr from t_dqcd where
wh=@wh)))*@sbcc)/1000+((select bjje from t_dqcd where wh=@wh)
*@hqll*(@ts-@sbcc*30))/30000),2) from t_dqcd where wh=@wh
select @dhlx=@yflx
go
总结:由于在程序中用游标对多行查询结果进行逐行处理,保证了使用SYBASE数据库查询语句进行子查询时返回值唯一,使整个程序结构简练、条理清晰。
0
相关文章
