今天发现居然出了个死循环.奇怪呀.
修改了一下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循环不用声明那么多变量,结构也简单易用.