本文聚焦 FETCH 七大導航模式、CLOSE/DEALLOCATE 資源管理差異、完整迴圈範例,以及透過 WHERE CURRENT OF 實現游標定位更新/刪除。
FETCH [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | RELATIVE n ]
FROM cursor_name
INTO @var1, @var2, ...;
| 選項 | 行為描述 | 首次執行位置 |
|---|---|---|
NEXT (預設) | 移至下一列 | 第一列 |
PRIOR | 移至上一列 | 第一列之前 (無資料) |
FIRST | 移至第一列 | 第一列 |
LAST | 移至最後一列 | 最後一列 |
ABSOLUTE n | 正數:從頭第 n 列;負數:從尾第 n 列;0:當前列 | 依 n 值 |
RELATIVE n | 正數:從當前向後 n 列;負數:向前 n 列;0:當前列 | 依 n 值 |
CLOSE cursor_name:釋放結果集鎖定與記憶體,**保留游標定義**,可再次 OPEN 重用。DEALLOCATE cursor_name:徹底移除定義,**釋放所有資源**,不可再用。GLOBAL 關鍵字:CLOSE GLOBAL MyCursor。DECLARE MyCursor CURSOR SCROLL FOR
SELECT GoodsCode, GoodsName FROM Master_Goods ORDER BY GoodsCode;
OPEN MyCursor;
FETCH NEXT FROM MyCursor INTO @GoodsCode, @GoodsName;
WHILE @@FETCH_STATUS = 0
BEGIN
-- 處理邏輯 (此處示範格式化列印)
SELECT @GoodsCode = CONVERT(CHAR(20), @GoodsCode);
SELECT @GoodsName = CONVERT(CHAR(20), @GoodsName);
PRINT @GoodsCode + ':' + @GoodsName;
FETCH NEXT FROM MyCursor INTO @GoodsCode, @GoodsName;
END
CLOSE MyCursor;
DEALLOCATE MyCursor;
針對**目前游標所指資料列**進行更新或刪除,無需再次指定主鍵條件,確保異動目標與讀取一致。
-- 更新目前列
UPDATE Master_Goods
SET GoodsName = 'yangyang8848'
WHERE CURRENT OF MyCursor;
-- 刪除目前列
DELETE FROM Master_Goods
WHERE CURRENT OF MyCursor;
前提: 游標宣告時需包含 FOR UPDATE 且非 READ_ONLY、STATIC 或 FAST_FORWARD 型態。
回傳**最後一次開啟的游標**結果集資料列數 (僅適用同步/靜態/鍵集游標;動態游標可能為負數表示非同步填充中)。
SELECT @@CURSOR_ROWS; -- 僅反映連線上最後開啟的游標