屬性(僅讀或可修改)
其語(yǔ)法格式如下:
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]
其中:
cursor_name
指游標(biāo)的名字。
INSENSITIVE
表明MS SQL SERVER 會(huì)將游標(biāo)定義所選取出來(lái)的數(shù)據(jù)記錄存放在一臨時(shí)表內(nèi)(建立在tempdb 數(shù)據(jù)庫(kù)下)。對(duì)該游標(biāo)的讀取操作皆由臨時(shí)表來(lái)應(yīng)答。因此,對(duì)基本表的修改并不影響游標(biāo)提取的數(shù)據(jù),即游標(biāo)不會(huì)隨著基本表內(nèi)容的改變而改變,同時(shí)也無(wú)法通過
游標(biāo)來(lái)更新基本表。如果不使用該保留字,那么對(duì)基本表的更新、刪除都會(huì)反映到游標(biāo)中。
另外應(yīng)該指出,當(dāng)遇到以下情況發(fā)生時(shí),游標(biāo)將自動(dòng)設(shè)定INSENSITIVE 選項(xiàng)。
在SELECT 語(yǔ)句中使用DISTINCT、 GROUP BY、 HAVING UNION 語(yǔ)句;
使用OUTER JOIN;
所選取的任意表沒有索引;
將實(shí)數(shù)值當(dāng)作選取的列。
上面介紹的是SQL_92 的游標(biāo)語(yǔ)法規(guī)則。下面介紹MS SQL SERVER 提供的擴(kuò)展了的游標(biāo)聲明語(yǔ)法,通過增加另外的保留字,使游標(biāo)的功能進(jìn)一步得到了增強(qiáng)其語(yǔ)法規(guī)則為;
LOCAL
定義游標(biāo)的作用域僅限在其所在的存儲(chǔ)過程、觸發(fā)器或批處理中。當(dāng)建立游標(biāo)的存儲(chǔ)過程執(zhí)行結(jié)束后,游標(biāo)會(huì)被自動(dòng)釋放。因此,我們常在存儲(chǔ)過程中使用OUTPUT 保留字,將游標(biāo)傳遞給該存儲(chǔ)過程的調(diào)用者,這樣在存儲(chǔ)過程執(zhí)行結(jié)束后,可以引用該游標(biāo)變量,在該種情況下,直到引用該游標(biāo)的最后一個(gè)就是被釋放時(shí),游標(biāo)才會(huì)自動(dòng)釋放。
GLOBAL
定義游標(biāo)的作用域是整個(gè)會(huì)話層會(huì)話層指用戶的連接時(shí)間它包括從用戶登錄到SQLSERVER 到脫離數(shù)據(jù)庫(kù)的整段時(shí)間。選擇GLOBAL 表明在整個(gè)會(huì)話層的任何存儲(chǔ)過程、觸發(fā)器或批處理中都可以使用該游標(biāo),只有當(dāng)用戶脫離數(shù)據(jù)庫(kù)、時(shí)該游標(biāo)才會(huì)被自動(dòng)釋放。
注意:如果既未使用GLOBAL也未使用LOCAL,那么SQL SERVER將使用default local cursor數(shù)據(jù)庫(kù)選項(xiàng),為了與以彰的版本歉容,該選項(xiàng)常設(shè)置為FALSE。