游標生命週期劃分為五個階段:宣告、開啟、讀取、關閉、釋放。本文詳細說明各階段語法與 DECLARE CURSOR 完整參數選項。
SELECT 查詢,**不檢索資料**,僅建立元資料。OPEN 執行查詢填充結果集,游標位置置於第一列之前。FETCH 移動位置並將欄位值賦予變數。CLOSE 釋放結果集鎖定與資源,定義保留可重開。DEALLOCATE 徹底移除定義釋放所有記憶體。DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
LOCAL (預設):僅限建立批次/程序/觸發器內可見,結束自動釋放。GLOBAL:整個連線工作階段可見,任何程序/批次可引用,斷開連線才隱性釋放。FORWARD_ONLY (預設):只能 FETCH NEXT 循序讀取。SCROLL:支援 FIRST, LAST, PRIOR, NEXT, ABSOLUTE, RELATIVE 任意導航。| 選項 | 行為描述 |
|---|---|
READ_ONLY | 唯讀,不允許透過游標修改/刪除,效能最佳。 |
SCROLL_LOCKS | 讀取時加鎖 (悲觀),保證透過游標更新/刪除成功。 |
OPTIMISTIC | 讀取不鎖,依時間戳/檢查碼偵測衝突,若資料已變更則更新/刪除失敗。 |
STATIC:結果集複製至 tempdb,唯讀快照。KEYSET:鍵值固定存 tempdb,非鍵欄更新可見。DYNAMIC:即時反映所有變更。FAST_FORWARD:FORWARD_ONLY + READ_ONLY 效能最佳化內部捷徑。-- 標準游標 (預設 FORWARD_ONLY, STATIC/KEYSET 視查詢而定)
DECLARE MyCursor CURSOR FOR SELECT * FROM Master_Goods;
-- 唯讀游標
DECLARE MyCursor CURSOR FOR SELECT * FROM Master_Goods FOR READ ONLY;
-- 可更新游標
DECLARE MyCursor CURSOR FOR SELECT * FROM Master_Goods FOR UPDATE;
OPEN MyCursor; -- 局部
OPEN GLOBAL MyCursor; -- 全域
執行 OPEN 即填充結果集,游標位置置於第一列之前,首次 FETCH NEXT 取得第一列。