用游标逐行处理,为什么不能更新?

pingshell 2017-11-16 04:49:41
create table BILL(
ID char(22) not null, -- 主键
NUM_SEQ_AR char(17) not null, -- 合约号
NUM_BILL char(5) not null, -- 账单号
NUM_SEQ_RPAY integer null, -- 还款期顺序号
NAM_AR varchar(150) null, -- 合约名称
COD_BRCH_REG char(6) null, -- 开户机构
LP_BILL_STS char(1) null, -- 账单账态
DATE_ACC_LAST_BAL char(8) null, -- 账户余额最后动账日期
AMT_LN decimal(18,2) null, -- 贷款金额
BAL_LN decimal(18,2) null, -- 贷款余额
COD_RPAY char(2) null, -- 还款方式
DATE_CRT_BILL char(8) null, -- 账单生成日期
AMT_SHD_CAP decimal(18,2) null, -- 应还本金
AMT_SHD_INT decimal(18,2) null, -- 应收正常利息
AMT_SHD_PENA_INT decimal(18,2) null, -- 应收罚息
AMT_SHD_COMP_INT decimal(18,2) null, -- 应收复利
DATE_RPAY_BILL char(8) null, -- 应还日期
AMT_RPAY_CAP decimal(18,2) null, -- 实还本金
AMT_RPAY_INT decimal(18,2) null, -- 已收正常息
AMT_RPAY_PENA_INT decimal(18,2) null, -- 已收罚息
AMT_SHD_PENA_INT_INT decimal(18,2) null, -- 罚息欠息
AMT_RPAY_COMP_INT decimal(18,2) null, -- 已收复利
AMT_SHD_COMP_INT_INT decimal(18,2) null, -- 复利欠息
DATE_SQUA char(8) null, -- 结清日期
DATE_EXD_BILL char(8) null, -- 转逾期日期
BAL_LN_EXD decimal(18,2) null, -- 逾期余额
primary key(ID)
)
go
insert into BILL select
NUM_SEQ_AR + NUM_BILL,
NUM_SEQ_AR,
NUM_BILL,
NUM_SEQ_RPAY,
NAM_AR,
COD_BRCH_REG,
LP_BILL_STS,
DATE_ACC_LAST_BAL,
AMT_LN,
BAL_LN,
COD_RPAY,
DATE_CRT_BILL,
AMT_SHD_CAP,
AMT_SHD_INT,
AMT_SHD_PENA_INT,
AMT_SHD_COMP_INT,
DATE_RPAY_BILL,
AMT_RPAY_CAP,
AMT_RPAY_INT,
AMT_RPAY_PENA_INT,
AMT_SHD_PENA_INT_INT,
AMT_RPAY_COMP_INT,
AMT_SHD_COMP_INT_INT,
DATE_SQUA,
DATE_EXD_BILL,
BAL_LN_EXD
from LN_BILL where COD_PD_CLS in('CE922', 'C1103', 'C8861', 'C88611')
and NUM_SEQ_AR in ('14071101230003246')
order by NUM_SEQ_AR asc, DATE_CRT_BILL desc, NUM_BILL desc --按合约号升序、账单生成日期降序、账单号降序
go
--从最后一期账单开始倒算每期账单的当前余额
declare @LoanAcc varchar(40), --贷款账号
@BillNum integer, --账单号
@Bal decimal(18, 2), --本期余额
@RepayCap decimal(18, 2), --实还本金
@PrevAcc varchar(40), --上条账号
@PrevNum integer, --上条账单号
@PrevBal decimal(18, 2), --上条余额
@PrevCap decimal(18, 2) --上条实还
declare c cursor for select NUM_SEQ_AR, NUM_BILL, BAL_LN, AMT_RPAY_CAP from BILL for update
open c
select @PrevAcc = '', @PrevNum = '0000', @PrevBal = 0.00, @PrevCap = 0.00
fetch c into @LoanAcc, @BillNum, @Bal, @RepayCap
while (@@sqlstatus = 0)
begin
select @LoanAcc, @BillNum, @Bal, @RepayCap
fetch c into @LoanAcc, @BillNum, @Bal, @RepayCap
if (@LoanAcc = @PrevAcc)
begin
select @Bal = @PrevBal + @RepayCap
update BILL set BAL_LN = @Bal where current of c
end
select @PrevAcc = @LoanAcc, @PrevNum = @BillNUm, @PrevBal = @Bal, @PrevCap = @RepayCap
end
close c
deallocate cursor c
go

Msg 7732, Level 16, State 0:
SQL Anywhere 错误 -633: 试图在只读游标上进行更新操作
...全文
397 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
pingshell 2017-11-21
  • 打赏
  • 举报
回复
没有人看吗?自已顶一下

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧