oracle结束死循环,sybase中cursor的使用中死循环问题解决

博客作者在使用Sybase时遇到了一个死循环问题,原因是while循环中删除数据导致游标位置出错。经过分析,发现是游标在处理相同PACKAGE_ID时引发的问题。通过在查询中添加`DISTINCT`关键字解决了这个问题。作者还提到Sybase的游标操作相对复杂,相比之下Oracle的for循环更加简洁易用。
摘要由CSDN通过智能技术生成

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

修改了一下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@]

仔细研究一下这个游标

定义:

declarecur_pack_fail_bcursorfor

selecta.PACKAGE_ID

fromSMS_SUBSCRIBE_STATUS a,xsmp.dbo.XSRV_APPLICATION_PACK_MAP b

wherea.DEST_MSISDN=@dest_user

anda.APPLICATION_ID=b.APPLICATION_ID

andb.PACK_ID=@packid

anda.PACKAGE_ID>0

使用的时候是针对每个PACKAGE_ID 把SMS_SUBSCRIBE_STATUS表中的做了处理并删除.

仔细看了一下,发现问题了.根据这个游标,可以得到若干个完全相同的PACKAGE_ID,但是第一次循环的时候就删除了,再一次循环的时候就出问题了.针对刚才的错误提示信息,分析一下,明白了.加一个distinct就ok了.之前测试的时候测试的不完全,所以出了这个问题.

declarecur_pack_fail_bcursorfor

selectdistincta.PACKAGE_ID

fromSMS_SUBSCRIBE_STATUS a,xsmp.dbo.XSRV_APPLICATION_PACK_MAP b

wherea.DEST_MSISDN=@dest_user

anda.APPLICATION_ID=b.APPLICATION_ID

andb.PACK_ID=@packid

anda.PACKAGE_ID>0

觉得sybase的游标做的太差,不如oracle.oracle使用for循环不用声明那么多变量,结构也简单易用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值