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