13.5.1 關閉游標
1、使用CLOSE 命令關閉游標
在處理完游標中數據之後必須關閉游標來釋放數據結果集和定位於數據記錄上的鎖。CLOSE 語句關閉游標,但不釋放游標占用的數據結構。如果准備在隨後的使用中再次打開游標,則應使用CLOSE 命令。其關閉游標的語法規則為:
CLOSE { { [GLOBAL] cursor_name } | cursor_variable_name }
2、自動關閉游標
我們已經了解到游標可應用在存儲過程、觸發器和Transact_SQL 腳本中。如果在聲明游標與釋放游標之間使用了事務結構,則在結束事務時游標會自動關閉。其具體的情況如下所示:
(1)、聲明一個游標
(2)、打開游標
(3)、讀取游標
(4)、BEGIN TRANSATION
(5)、數據處理
(6)、COMMIT TRANSATION
(7)、回到步驟3
在這樣的應用環境中。當從游標中讀取一條數據記錄進行以BEGIN TRANSATION為開頭,COMMIT TRANSATION 或ROLLBACK 為結束的事務處理時,在程序開始運行後,第一行數據能夠被正確返回,經由步驟7, 程序回到步驟3, 讀取游標的下一行,此時常會發現游標未打開的錯誤信息。其原因就在於當一個事務結束時,不管其是以COMMIT TRANSATION 還是以ROLLBACK TRANSATION 結束,MS SQL SERVER 都會自動關閉游標,所以當繼續從游標中讀取數據時就會造成錯誤。
解決這種錯誤的方法就是使用SET 命令將CURSOR_CLOSE_ON_COMMIT 這一參數設置為OFF 狀態。其目的就是讓游標在事務結束時仍繼續保持打開狀態,而不會被關閉。使用SET 命令的格式為:
SET CURSOR_CLOSE_ON_COMMIT OFF
13.5.2 釋放游標
在使用游標時,各種針對游標的操作或者引用游標名,或者引用指向游標的游標變量。當CLOSE 命令關閉游標時,並沒有釋放游標占用的數據結構。因此常使用DEALLOCATE 命令。通過該命令可以刪除掉游標與游標名或游標變量之間的聯系,並且釋放游標占用的所有系統資源。其語法規則為:
DEALLOCATE { { [GLOBAL] cursor_name } | @cursor_variable_name}
各參數的含義參看13.3 打開游標一節。
當使用DEALLOCATE @cursor_variable_name 來刪除游標時,游標變量並不會被釋放,除非超過使用該游標的存儲過程、觸發器的范圍(即游標的作用域)。
13.5.3 游標變量
游標變量是從MS SQL SERVER 7 版本才開始使用的一種新增數據類型。定義一個游標變量主要有兩種方法。
首先我們先聲明一個游標。
使用SET 語句將一游標賦值給游標變量:
將聲明游標語句放在游標賦值語句中,如下所示:
例13-5: 下面給出一個具體完整的例子,在該例子中我們對DEALLOCATE 命令將有更加清晰的了解。