綠色資源網(wǎng):您身邊最放心的安全下載站! 最新軟件|熱門排行|軟件分類|軟件專題|廠商大全

綠色資源網(wǎng)

技術(shù)教程
您的位置:首頁(yè)數(shù)據(jù)庫(kù)類SQL Server → SQL-SERVER 聲明游標(biāo)

SQL-SERVER 聲明游標(biāo)

我要評(píng)論 2009/04/08 02:24:55 來源:綠色資源網(wǎng) 編輯:佚名 [ ] 評(píng)論:0 點(diǎn)擊:596次

SQL-SERVER 聲明游標(biāo)
每一個(gè)游標(biāo)必須有四個(gè)組成部分這四個(gè)關(guān)鍵部分必須符合下面的順序;
1.DECLARE 游標(biāo)
2.OPEN 游標(biāo)
3.從一個(gè)游標(biāo)中FETCH 信息
4.CLOSE 或DEALLOCATE 游標(biāo)
通常我們使用DECLARE 來聲明一個(gè)游標(biāo)聲明一個(gè)游標(biāo)主要包括以下主要內(nèi)容:

  • 游標(biāo)名字
  • 數(shù)據(jù)來源(表和列)
  • 選取條件
  • 屬性(僅讀或可修改)
    其語(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)定義所選取出來的數(shù)據(jù)記錄存放在一臨時(shí)表內(nèi)(建立在tempdb 數(shù)據(jù)庫(kù)下)。對(duì)該游標(biāo)的讀取操作皆由臨時(shí)表來應(yīng)答。因此,對(duì)基本表的修改并不影響游標(biāo)提取的數(shù)據(jù),即游標(biāo)不會(huì)隨著基本表內(nèi)容的改變而改變,同時(shí)也無法通過
    游標(biāo)來更新基本表。如果不使用該保留字,那么對(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)作選取的列。
  • SCROLL
    表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用該保留字,那么只能進(jìn)行NEXT 提取操作。由此可見,SCROLL 極大地增加了提取數(shù)據(jù)的靈活性,可以隨意讀取結(jié)果集中的任一行數(shù)據(jù)記錄,而不必關(guān)閉再
    重開游標(biāo)。
  • select_statement
    是定義結(jié)果集的SELECT 語(yǔ)句。應(yīng)該注意的是,在游標(biāo)中不能使用COMPUTE、COMPU- TE BY、 FOR BROWSE、 INTO 語(yǔ)句。
  • READ ONLY
    表明不允許游標(biāo)內(nèi)的數(shù)據(jù)被更新盡管在缺省狀態(tài)下游標(biāo)是允許更新的。而且在UPDATE或DELETE 語(yǔ)句的WHERE CURRENT OF 子句中,不允許對(duì)該游標(biāo)進(jìn)行引用。
  • UPDATE [OF column_name[,…n]]
    定義在游標(biāo)中可被修改的列,如果不指出要更新的列,那么所有的列都將被更新。當(dāng)游標(biāo)被成功創(chuàng)建后,游標(biāo)名成為該游標(biāo)的惟一標(biāo)識(shí),如果在以后的存儲(chǔ)過程、觸發(fā)器或Transact_SQL 腳本中使用游標(biāo),必須指定該游標(biāo)的名字。

  • 上面介紹的是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。
  • FORWARD_ONLY
    選項(xiàng)指明在從游標(biāo)中提取數(shù)據(jù)記錄時(shí),只能按照從第一行到最后一行的順序,此時(shí)只能選用FETCH NEXT 操作。除非使用STATIC, KEYSET 和DYNAMIC 關(guān)鍵字,否則如果未指明是使用FORWARD_ONLY 還是使用SCROLL, 那么FORWARD_ONLY 將成為缺省選項(xiàng),因?yàn)槿羰褂肧TATIC KEYSET 和DYNAMIC 關(guān)鍵字,則變成了SCROLL 游標(biāo)。另外如果使用了FORWARD_ONLY, 便不能使用FAST_FORWARD。
  • STATIC
    選項(xiàng)的含義與INSENSITIVE 選項(xiàng)一樣,MS SQL SERVER 會(huì)將游標(biāo)定義所選取出來的數(shù)據(jù)記錄存放在一臨時(shí)表內(nèi)(建立在tempdb 數(shù)據(jù)庫(kù)下)。對(duì)該游標(biāo)的讀取操作皆由臨時(shí)表來應(yīng)答。因此對(duì)基本表的修改并不影響游標(biāo)中的數(shù)據(jù),即游標(biāo)不會(huì)隨著基本表內(nèi)容的
    改變而改變,同時(shí)也無法通過游標(biāo)來更新基本表。
  • KEYSET
    指出當(dāng)游標(biāo)被打開時(shí),游標(biāo)中列的順序是固定的,并且MS SQL SERVER 會(huì)在tempdb內(nèi)建立一個(gè)表,該表即為KEYSET KEYSET 的鍵值可惟一識(shí)別游標(biāo)中的某行數(shù)據(jù)。當(dāng)游標(biāo)擁有者或其它用戶對(duì)基本表中的非鍵值數(shù)據(jù)進(jìn)行修改時(shí),這種變化能夠反映到游標(biāo)中,所以游標(biāo)用戶或所有者可以通過滾動(dòng)游標(biāo)提限這些數(shù)據(jù)。

        當(dāng)其它用戶增加一條新的符合所定義的游標(biāo)范圍的數(shù)據(jù)時(shí),無法由此游標(biāo)讀到該數(shù)據(jù)。因?yàn)門ransact-SQL 服務(wù)器游標(biāo)不支持INSERT 語(yǔ)句。
        如果在游標(biāo)中的某一行被刪除掉,那么當(dāng)通過游標(biāo)來提取該刪除行時(shí),@@FETCH_STATUS 的返回值為-2。 @@FETCH_STATUS 是用來判斷讀取游標(biāo)是否成功的系統(tǒng)全局變量。
        由于更新操作包括兩部分:刪除原數(shù)據(jù)插入新數(shù)據(jù),所以如果讀取原數(shù)據(jù),@@FETCH_STATUS 的返回值為-2; 而且無法通過游標(biāo)來讀取新插入的數(shù)據(jù)。但是如果使用了WHERE CURRENT OF 子句時(shí),該新插入行數(shù)據(jù)便是可見的。
    注意:如果基礎(chǔ)表未包含惟一的索引或主鍵,則一個(gè)KEYSET游標(biāo)將回復(fù)成STATIC游標(biāo)。
  • DYNAMIC
    指明基礎(chǔ)表的變化將反映到游標(biāo)中,使用這個(gè)選項(xiàng)會(huì)最大程度上保證數(shù)據(jù)的一致性。然而,與KEYSET 和STATIC 類型游標(biāo)相比較,此類型游標(biāo)需要大量的游標(biāo)資源。
  • FAST_FORWARD
    指明一個(gè)FORWARD_ONLY, READ_ONLY 型游標(biāo)。此選項(xiàng)已為執(zhí)行進(jìn)行了優(yōu)化。如果SCROLL 或FOR_UPDATE 選項(xiàng)被定義,則FAST_FORWARD 選項(xiàng)不能被定義。
  • SCROLL_LOCKS
    指明鎖被放置在游標(biāo)結(jié)果集所使用的數(shù)據(jù)上當(dāng)。數(shù)據(jù)被讀入游標(biāo)中時(shí),就會(huì)出現(xiàn)鎖。這個(gè)選項(xiàng)確保對(duì)一個(gè)游標(biāo)進(jìn)行的更新和刪除操作總能被成功執(zhí)行。如果FAST_FORWARD選項(xiàng)被定義,則不能選擇該選項(xiàng)。另外,由于數(shù)據(jù)被游標(biāo)鎖定,所以當(dāng)考慮到數(shù)據(jù)并發(fā)處理時(shí),應(yīng)避免使用該選項(xiàng)。
  • OPTIMISTIC
    指明在數(shù)據(jù)被讀入游標(biāo)后,如果游標(biāo)中某行數(shù)據(jù)已發(fā)生變化,那么對(duì)游標(biāo)數(shù)據(jù)進(jìn)行更新或刪除可能會(huì)導(dǎo)致失敗。如果使用了FAST_FORWARD 選項(xiàng),則不能使用該選項(xiàng)。
  • TYPE_WARNING
    指明若游標(biāo)類型被修改成與用戶定義的類型不同時(shí),將發(fā)送一個(gè)警告信息給客戶端。
    注意:不可以將SQL_92的游標(biāo)語(yǔ)法規(guī)則與MS SQL SERVER的游標(biāo)擴(kuò)展用法混合在一起使用。

    下面我們將總結(jié)一下聲明游標(biāo)時(shí)應(yīng)注意的一些問題。
    如果在CURSOR 前使用了SCROLL 或INSENSITIVE 保留字,則不能在CURSOR 和FOR select_statement 之間使用任何的保留字。反之同理。
    如果用DECLARE CURSOR 聲明游標(biāo)時(shí),沒有選擇READ_ONLY、 OPTIMISTIC 或SCROLL_LOCKS 選項(xiàng)時(shí),游標(biāo)的缺省情況為:
    如果SELECT 語(yǔ)句不支持更新,則游標(biāo)為READ_ONLY;
    STATIC 和FAST_FORWARD 類型的游標(biāo)缺省為READ_ONLY;   
    DYNAMIC 和KEYSET 游標(biāo)缺省為OPTIMISTIC。
    我們僅能在Transact-SQL 語(yǔ)句中引用游標(biāo),而不能在數(shù)據(jù)庫(kù)API 函數(shù)中引用。
    游標(biāo)被聲明以后,可以通過系統(tǒng)過程對(duì)其特性進(jìn)行設(shè)置。
    對(duì)那些有權(quán)限對(duì)視圖、表或某些列執(zhí)行SELECT 語(yǔ)句的用戶而言,它也具有使用游標(biāo)的缺省權(quán)限。

關(guān)鍵詞:SQL-SERVER

閱讀本文后您有什么感想? 已有 人給出評(píng)價(jià)!

  • 0 歡迎喜歡
  • 0 白癡
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙視