使用游标出错,请PB达人指点指点
源程序如下:
declare c1 cursor for select acct_id,serv_id,bill_item_type_id,charge from tmp_gcust_charge;
open c1;
if sqlca.sqlcode<>0 then
printmsg("打开取临时表中费用游标出错!错误原因:"+sqlca.sqlerrtext)
return
end if
FETCH c1 INTO :ls_acct_id,:ls_serv_id,:ls_item_type_id,:ls_charge;
do while sqlca.sqlcode = 0
CHOOSE CASE ls_item_type_id
CASE 1001
ls_sql="update "+ls_tab+" set basic_charge="+string(ls_charge)+" where acct_id="+string(ls_acct_id)+" AND SERV_ID="+string(ls_serv_id)
EXECUTE IMMEDIATE :ls_sql;
if sqlca.sqlcode<>0 then
messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)
rollback;
return
end if
commit;
CASE 1002
ls_sql="update "+ls_tab+" set sh_charge="+string(ls_charge)+" where acct_id="+string(ls_acct_id)+" AND SERV_ID="+string(ls_serv_id)
EXECUTE IMMEDIATE :ls_sql;
if sqlca.sqlcode<>0 then
messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)
rollback;
return
end if
commit;
CASE 1003
ls_sql="update "+ls_tab+" set wh_charge="+string(ls_charge)+" where acct_id="+string(ls_acct_id)+" AND SERV_ID="+string(ls_serv_id)
EXECUTE IMMEDIATE :ls_sql;
if sqlca.sqlcode<>0 then
messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)
rollback;
return
end if
commit;
CASE 1006
ls_sql="update "+ls_tab+" set gnct_charge="+string(ls_charge)+" where acct_id="+string(ls_acct_id)+" AND SERV_ID="+string(ls_serv_id)
EXECUTE IMMEDIATE :ls_sql;
if sqlca.sqlcode<>0 then
messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)
rollback;
return
end if
commit;
CASE 1029
ls_sql="update "+ls_tab+" set gjct_charge="+string(ls_charge)+" where acct_id="+string(ls_acct_id)+" AND SERV_ID="+string(ls_serv_id)
EXECUTE IMMEDIATE :ls_sql;
if sqlca.sqlcode<>0 then
messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)
rollback;
return
end if
commit;
CASE 1061
ls_sql="update "+ls_tab+" set xyw_charge="+string(ls_charge)+" where acct_id="+string(ls_acct_id)+" AND SERV_ID="+string(ls_serv_id)
EXECUTE IMMEDIATE :ls_sql;
if sqlca.sqlcode<>0 then
messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)
rollback;
return
end if
commit;
END CHOOSE
FETCH c1 INTO :ls_acct_id,:ls_serv_id,:ls_item_type_id,:ls_charge;
loop
close c1;
if sqlca.sqlcode <> 0 then
printmsg("关闭取游标错!错误原因:"+sqlca.sqlerrtext)
return
end if
结果中只更改了一条记录,提示关闭游标出错,错误原因是procedure has not been excuted or has no results.请达人指点
问题点数:20、回复次数:8Top
1 楼fibbery(飞)(睡足了才能提高效率)回复于 2005-04-19 19:17:48 得分 0
首先更正你一个问题,你在更新表发生错误的时候,你将执行return,那么你的逻辑将不会走到close cl;
其次,关闭游标会不会影响sqlca.sqlcode?这个我不太清楚。建议检查该值是否为100,如果是100则说明不会影响,这个100是上面检索没有数据时的值。你也可以在刚打开游标时马上关闭再看看sqlca.sqlcode的值来验证一下。Top
2 楼cquptlilian()回复于 2005-04-20 08:41:02 得分 0
我试了一下你说的第二点,打开游标时sqlcode的值是0,在select语句使用时且查询时有记录时才是100吧,其他应该是0或-1吧,不知道我分析的对不对。在同样的环境下我运行下面的代码则是正确的:
string ls_begin_date,ls_end_date,ls_value
declare cur_cycle cursor for
select billing_cycle_id,cycle_begin_date,cycle_end_date from billing_cycle
where billing_cycle_id between :pl_cur_cycle - 12 and :pl_cur_cycle
order by billing_cycle_id desc;
open cur_cycle;
if sqlca.sqlcode <> 0 then
printmsg("打开取帐务周期游标错!错误原因:"+sqlca.sqlerrtext)
return false
end if
fetch cur_cycle into :ll_cycle_id,:ls_begin_date,:ls_end_date;
do while sqlca.sqlcode = 0
ls_value = left(ls_begin_date,4)+"/"+mid(ls_begin_date,5,2)+"/"+right(ls_begin_date,2)+&
'--' + left(ls_end_date,4)+"/"+mid(ls_end_date,5,2)+"/"+right(ls_end_date,2)
ls_value = ls_value + space(30 - len(ls_value))
plb_ddlb.additem(ls_value + '|' + string(ll_cycle_id))
fetch cur_cycle into :ll_cycle_id,:ls_begin_date,:ls_end_date;
loop
close cur_cycle;
if sqlca.sqlcode <> 0 then
printmsg("关闭取帐务周期游标错!错误原因:"+sqlca.sqlerrtext)
return false
end if
很奇怪,请各位高手继续帮我分析一下Top
3 楼fibbery(飞)(睡足了才能提高效率)回复于 2005-04-20 08:46:18 得分 5
不对,有数据返回时为0,无数据返回为100,发生错误为-1。Top
4 楼w7a8(阿飞)回复于 2005-04-20 08:52:28 得分 15
在游标中不能commit的Top
5 楼cquptlilian()回复于 2005-04-20 09:15:11 得分 0
w7a8(阿飞) 的指点解决了问题,把commit放在close c1后面就正确了,谢谢fibbery(飞)(3.20VC++) 和 w7a8(阿飞) 两位大虾的指教了^_^Top
6 楼xyqiqi(琪琪)回复于 2005-04-20 09:23:29 得分 0
那还不赶快结贴Top
7 楼fibbery(飞)(睡足了才能提高效率)回复于 2005-04-20 10:20:05 得分 0
哦,长知识了!Top
8 楼cquptlilian()回复于 2005-04-20 18:13:51 得分 0
怎样结贴啊,我是菜鸟,指点啊Top




