第十七章
使用Cursor來處理數據
•Cursor是一種機制,處理上以行為基礎預先定義查詢的結果集
•Cursor的優點
•你可以以行處理數據
–SQL是一種集合導向語言
–通常是在一個給定的條件匹配所有行處理
–Cursor允許以行的處理
•你可以依據以行修改數據
•你可以橋接一套關連式資料庫導向和大多數編程語言中以行導向之間差距
•Cursor的生命週期
•Declare the cursor (宣告Cursor)
•當宣告一個Cursor
–你指定的查詢
–您指定的Cursor模式
•read only
•update
–Adaptive Server的儲量為cursor內存資源
•語法
deciare cursor_name cursor
for select_statement
[ for { read only | update [of column_name_list ] } ]
•Open the cursor (打開Cursor)
•Adaptive Server將開始建立結果集
•將指標定位在結果集的第一行
•語法
open cursor_name
•Fetch each row (每行讀取)
•當您執行fetch操作Cursor名稱
–Cursor指標移動到下一個有效行Cursor結果集
–它返回Cursor結果集下一個有效行
•您也可以選擇包括fetch存儲列值局部變量
–這些被稱為局部變量為fetch目標名單
–大部分cursor在現實世界中環境使用的目標名單
•語法
fetch cursor_name [ into fetch_target_list ]
•Close the cursor (關閉Cursor)
•停止查詢程序
•Deallocate the cursor (釋放該Cursor)
•所有的內存分配給Cursor資源被釋放
•Cursor關閉和重開
•下列情況Adeptive Server會自動關閉Cursor
–建立Cursor的session結束
–預設程序建立Cursor結束
•您可以重新打開一個關閉的Cursor
–指標復位到結果集開頭
•你不能重新開啟已經被釋放Cursor再次宣告
•關閉和釋放Cursor
•語法
close cursor_name
deallocate cursor cursor_name
•Cursor全域變數
•@@rowcount
–提取後,返回所有返回的行的總數,該Cursor 提取語法
–Cursor 在任何DML語法後,返回由該陳述影響的行數
•@@sqlstatus
–返回0,如果先前提取成功
–返回1,為一個錯誤結果來自提取
–返回2,如果先前的提取失敗,因為存在沒有更多行的獲取
•額外提取備註
•提取,默認情況下,移動指標到下一個結果集
–Sybase ASE的15.0之前,沒有辦法移動結果集指標
–從Sybase ASE15.0開始,Cursor指標可以在兩個方向上經過結果集
–關閉並重新打開Cursor復位指標開始
•默認情況下,提取總是返回一行
–可以使用設定Cursor行選項來改變這種設置
–語法
set cursor rows number for cursor_name
•推薦的開發實踐
•始終指定一個宣告陳述在Cursor模式
•因為Cursor可以使對資源的顯著要求,以免留下長時間打開的Cursor
•如果每一行都是執行同樣操作的Cursor,可以考慮替代Cursor
•替代Cursor
•Cursor並不總是只有這樣才能完成一個給定的任務
–重寫使用case語句
–重寫使用兩個查詢
•透過Cursor更新數據
•語法
update table_name
set column1 = { expression | select_statement }
[ , column2 = { expression | select_statement } … ]
where current of cursor_name
•對該行進行更新到該指標當前指向
–在大多數情況下,這是該行是最近剛剛抓取過
•不將Cursor移動到下一行的指標
•可以做在只有一個Cursor的更新模式
•透過Cursor刪除數據
•語法
delete [ from ] table_name where current of cursor_name
•刪除該行到當前該指標指向
–在大多數情況下,這是該行是最近剛剛抓取過
•你需要執行Cursor提取下一行
•可以做在只有一個Cursor更新模式
•規則中使用更新Cursor
•哪些為更新Cursor聲明表必須是
–唯一索引
–使用數據頁或數據行的鎖定方案
•Cursors and Transactions
•更新Cursor獲取更新鎖
–鎖被被提升為獨占鎖當更新當前或刪除當前正在執行
–如果不晉升,更新鎖被釋放時,Cursor的位置移至關閉數據頁
•關閉endtran是一個選項,確定會發生什麼變化的 transaction Cursor時發生rollback或提交
–當打開時,Cursor被關閉後,rollback或提交
–當關閉時
•Cursor仍然打開在rollback或提交後
•修改基於Cursor的位置可提交在以行的基礎上,可以增加並發性
•語法
set close on endtran { on | off }
•Cursor系統程序
sp_cursorinfo { cursor_level | NULL } [, cursor_name ]
•顯示有關Cursor的訊息
–如果你指定一個級別,信息返回Cursor只能在指定的嵌套級別
–如果你指定NULL,返回Cursor在所有嵌套級別
–如果你指定一個名稱,僅適用於具有該名稱Cursor資訊回傳