hur.cn - 华软网

 热门搜索

使用游标出错,请PB达人指点指点

  作者:未知    来源:网络    更新时间:2017/9/26
源程序如下:
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.请达人指点
------华软网友回答------
首先更正你一个问题,你在更新表发生错误的时候,你将执行return,那么你的逻辑将不会走到close cl;
其次,关闭游标会不会影响sqlca.sqlcode?这个我不太清楚。建议检查该值是否为100,如果是100则说明不会影响,这个100是上面检索没有数据时的值。你也可以在刚打开游标时马上关闭再看看sqlca.sqlcode的值来验证一下。
------华软网友回复------
我试了一下你说的第二点,打开游标时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

很奇怪,请各位高手继续帮我分析一下
------华软网友回复------
不对,有数据返回时为0,无数据返回为100,发生错误为-1。
------华软网友回复------
在游标中不能commit的
------华软网友回复------
w7a8(阿飞) 的指点解决了问题,把commit放在close c1后面就正确了,谢谢fibbery(飞)(3.20VC++) 和 w7a8(阿飞) 两位大虾的指教了^_^
------华软网友回复------
那还不赶快结贴
------华软网友回复------
哦,长知识了!
------华软网友回复------
怎样结贴啊,我是菜鸟,指点啊      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。