sybase中cursor的使用中死迴圈問題解決

wangzh3發表於2007-02-28

今天發現居然出了個死迴圈.奇怪呀.

修改了一下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部落格 ” ,連結:http://blog.itpub.net/47869/viewspace-900958/,如需轉載,請註明出處,否則將追究法律責任。

相關文章