楊銘
摘 要: 游標是SQL數據庫中從數據記錄結果集中提取記錄的一種重要機制,其手段靈活,形式多樣。本文介紹了游標的概念、分類、生命周期和使用游標應該注意的問題。
關鍵詞: 游標 SQL數據庫 教學應用
一、游標的概念
游標(cursor)是系統為用戶專門開設的用來存放SQL語句執行結果的一個數據緩沖區。通常在數據庫開發過程中要檢索一條記錄時,我們可以使用SELECT語句操作??墒?,如果想從某個結果集中逐一的讀取記錄,使用SELECT語句則變得麻煩,此時利用游標可以輕松解決。游標其實可以理解為一個定義在特定數據集上的指針,可以控制這個指針遍歷數據集,或者僅僅是指向特定的行。用戶通過SQL語句從游標中逐一地得到記錄,然后賦給主變量,再通過主語言進一步處理。
二、游標的分類
游標是指向SELECT語句查詢出的多行數據的指針,SELECT語句查詢出的行組成一結果表,稱為活動集,游標指向的行稱為當前行。一般說來一般說來,游標分為三類,即滾動游標、非滾動游標和更新游標。
1.滾動游標是游標的位置可來回移動,即程序可以依據實際需要指向活動集中某一條記錄。
2.非滾動游標是指活動集中的每條記錄不可被選擇讀取而只能被依次讀取。
3.更新游標活動集中的記錄只能被一次讀取,其特點在于:數據庫將游標當前指向的記錄加鎖,當程序讀下一條記錄時,本條記錄解鎖,下一條記錄加鎖,鎖加在數據庫基本表對應的行上。
三、游標的生命周期
在T-SQL中,游標的生命周期由五個部分組成,即定義游標(DECLARE)、打開游標(Open)、使用游標(FETCH)、關閉游標(CLOSE)和釋放游標(DEALLOCATE)。具體實現步驟為:
1.定義游標
在T-SQL中,定義一個游標可以是非常簡單的,也可以是相對復雜的,取決于游標的參數,而游標的參數設置取決于你對游標原理的了解程度。游標其實可以理解成一個定義在特定數據集上的指針,我們可以控制這個指針遍歷數據集,或者僅僅是指向特定的行,所以游標是定義在以Select開始的數據集上的,T-SQL中的游標定義的格式如下:
DECLARE〈游標名〉[SCROLL]CURSOR FOR SELECT語句
有關鍵字SCROLL的DECLARE語句定義的是滾動游標。SELECT語句可表為:
SELECT子句
[INTO子句]
FROM子句
[WHERE子句]
[GROUP BY子句]
[HAVING子句]
[ORDER BY子句]
[INTO TEMP子句]
DECLARE語句的作用是在數據庫系統表中分配該游標資源,給游標一個自己的名字。游標名的作用范圍是只要游標不被釋放(FREE),在定義它的模塊內就有效。
2.打開游標
當定義完游標后,游標需要打開后使用,只有簡單一行代碼。注意,當全局游標和局部游標變量重名時,默認會打開局部變量游標。打開游標語句執行游標定義中的SELECT語句,查詢結果存放在游標緩沖區中(當打開的是滾動游標時,還要建一個臨時表)。當游標的訪問位置沒有指定時,默認將游標指針指向游標區中的第一條記錄。查詢結果的內容依據設置的查詢語句和查詢條件。打開游標的語句格式:
OPEN〈游標名〉
3.使用游標
游標的使用分為兩部分:一部分是操作游標在數據集內的指向,另一部分是將游標所指向的行的部分或全部內容進行操作。代碼如下:
FETCH[[NEXT|PRIOR|FIRST|LAST| ABSOLUTE n| RELATIVE n]
FROM]〈游標名〉
[INTO @變量1,@變量2,…]
4.關閉游標
在游標使用完之后,一定要記得關閉,關閉后游標區的數據不可再讀,但可以使用OPEN語句再次打開后再使用該游標。代碼如下:
CLOSE〈游標名〉
5.釋放游標
當游標不再需要被使用后釋放游標。代碼如下:
DEALLOCATE〈游標名〉
四、游標的優化
1.用完之后一定要關閉和釋放。
2.盡量不要在大量數據上定義游標。
3.盡量不要使用游標上更新數據。
4.盡量不要使用insensitive,static和keyset這些參數定義游標。
5.如果只對數據進行讀取,當讀取時只用到FETCH NEXT選項,則最好使用FORWARD_ONLY參數。
五、結語
在數據庫中,游標提供了一種可以操作從表中已被檢索出的數據結果集中記錄的靈活機制,可以從多條數據記錄的結果集中每次提取一條記錄。盡管如此,但游標會一定程度地影響系統的性能,如使用游標會導致頁鎖與表鎖的增加,以及網絡通信量的增加等,所以更要正確使用游標,靈活應用游標。
參考文獻:
[1]田耕.淺談數據庫游標及其應用[J].廣東金融電腦,2000(03).
[2]林曉峰.SQL SER VER服務器游標應用方法與實例[J].成才,2000(07).
[3]陳芳勤.SQL Server 2000中游標的應用[J].中國科技信息,2008(13).