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

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

修改了一下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循环不用声明那么多变量,结构也简单易用.