ITPub博客

首页 > 数据库 > 数据库开发技术 > sybase中cursor的使用中死循环问题解决

sybase中cursor的使用中死循环问题解决

原创 数据库开发技术 作者:wangzh3 时间:2007-02-28 19:14:02 0 删除 编辑

今天发现居然出了个死循环.奇怪呀.

修改了一下while循环的条件.

while @@sqlstatus=0

发现报了如下错误:

582 : 0 : Number (582) Severity (16) State (3) Server (t10) Procedure (sms_clear_pre_sub) 游标'cur_pack_fail_b'被隐式地关闭,原因是当前游标位置由于更新或删除而被删除。游标扫描位置不能恢复。这发生在对一张以上的表引用的时候。 (24000)


559 : 0 : Number (559) Severity (16) State (1) Server (t10) Procedure (sms_clear_pre_sub) 试图使用未打开的游标'cur_pack_fail_b'。使用系统存储过程sp_cursorinfo来得到更多信息。 (24000)

[@more@]

仔细研究一下这个游标

定义:

declare cur_pack_fail_b cursor for

select a.PACKAGE_ID
from SMS_SUBSCRIBE_STATUS a,xsmp.dbo.XSRV_APPLICATION_PACK_MAP b
where a.DEST_MSISDN=@dest_user
and a.APPLICATION_ID=b.APPLICATION_ID
and b.PACK_ID=@packid
and a.PACKAGE_ID>0
使用的时候是针对每个PACKAGE_ID 把SMS_SUBSCRIBE_STATUS表中的做了处理并删除.
仔细看了一下,发现问题了.根据这个游标,可以得到若干个完全相同的PACKAGE_ID,但是第一次循环的时候就删除了,再一次循环的时候就出问题了.针对刚才的错误提示信息,分析一下,明白了.加一个distinct就ok了.之前测试的时候测试的不完全,所以出了这个问题.

declare cur_pack_fail_b cursor for

select distinct a.PACKAGE_ID
from SMS_SUBSCRIBE_STATUS a,xsmp.dbo.XSRV_APPLICATION_PACK_MAP b
where a.DEST_MSISDN=@dest_user
and a.APPLICATION_ID=b.APPLICATION_ID
and b.PACK_ID=@packid
and a.PACKAGE_ID>0
觉得sybase的游标做的太差,不如oracle.oracle使用for循环不用声明那么多变量,结构也简单易用.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/47869/viewspace-900958/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 时间就像乳沟
请登录后发表评论 登录
全部评论
  • 博文量
    301
  • 访问量
    10875979