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

綠色資源網

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

SQL-SERVER 聲明遊標

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

SQL-SERVER 聲明遊(yóu)標
每(měi)一個遊標(biāo)必須有四(sì)個組成部分這四個(gè)關鍵部分必須符合下(xià)麵的(de)順序;
1.DECLARE 遊標
2.OPEN 遊標
3.從(cóng)一個遊標中FETCH 信息(xī)
4.CLOSE 或DEALLOCATE 遊標
通常我們使用DECLARE 來聲明一個遊標聲明一個遊標主要包括(kuò)以下主要內容:

  • 遊標名(míng)字(zì)
  • 數據(jù)來(lái)源(表和列)
  • 選(xuǎn)取條件
  • 屬性(僅讀(dú)或可修改)
    其語法格式如(rú)下:
    DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
    FOR select_statement
    [FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]
    其中:
  • cursor_name
    指遊標的(de)名字。
  • INSENSITIVE
    表明MS SQL SERVER 會將遊標定義所(suǒ)選(xuǎn)取出來的(de)數(shù)據記(jì)錄存放在一臨時表內(建立在(zài)tempdb 數據庫下)。對該遊標的讀取操作皆由臨時表來應(yīng)答。因此,對基本表的修改(gǎi)並(bìng)不影響(xiǎng)遊標提取的數據,即遊(yóu)標不會隨著基本表(biǎo)內容的改變(biàn)而(ér)改變(biàn),同時也無法通過
    遊(yóu)標(biāo)來更新基本表。如果不使用該保留字,那麽對(duì)基本(běn)表的(de)更新、刪除都會反映到遊(yóu)標中。

    另外應該指(zhǐ)出(chū),當遇到以(yǐ)下(xià)情況發生時,遊標將自動設定INSENSITIVE 選項。
    在SELECT 語句中使用DISTINCT、 GROUP BY、 HAVING UNION 語(yǔ)句;
    使用OUTER JOIN;
    所選取的任(rèn)意表沒有索引;
    將實數值當作選取的列。
  • SCROLL
    表明所有的(de)提取(qǔ)操作(zuò)(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如(rú)果不(bú)使用該保留字(zì),那(nà)麽隻能進(jìn)行NEXT 提取操作(zuò)。由此可見,SCROLL 極大地增加了提取數據的靈(líng)活性,可以(yǐ)隨(suí)意讀取結果集中的任一(yī)行數據記錄,而(ér)不必關閉再
    重開遊標。
  • select_statement
    是定(dìng)義結果集的SELECT 語句。應(yīng)該注意的是,在遊標中不能使用COMPUTE、COMPU- TE BY、 FOR BROWSE、 INTO 語句。
  • READ ONLY
    表明不允許遊標內的數據被更新盡(jìn)管在缺(quē)省狀態下遊標是允許更新的。而且在UPDATE或DELETE 語句的WHERE CURRENT OF 子(zǐ)句中,不允許對該遊標(biāo)進行引用。
  • UPDATE [OF column_name[,…n]]
    定義在遊(yóu)標(biāo)中可被修改(gǎi)的列,如果不指(zhǐ)出要更新的列,那麽所有(yǒu)的列(liè)都將被更新。當遊標被成功創建(jiàn)後,遊標名成為該遊標的惟一標識,如果在以後的存儲過程、觸發器或Transact_SQL 腳本中使用遊標,必(bì)須指定該遊標(biāo)的名字。

  • 上麵介紹的是SQL_92 的遊標語法規(guī)則。下(xià)麵(miàn)介紹MS SQL SERVER 提(tí)供的擴展了的遊標聲明語法,通過增加另(lìng)外的保留字,使遊標(biāo)的功能進一步(bù)得到了增強其(qí)語(yǔ)法(fǎ)規則(zé)為;
  • LOCAL
    定義遊(yóu)標的作(zuò)用域僅限在其所在的存儲過程、觸發器或批處理(lǐ)中。當(dāng)建立遊標的存儲過程執行結(jié)束後,遊(yóu)標會被自動釋放。因此,我們常在存儲過程(chéng)中使用OUTPUT 保(bǎo)留字,將遊標傳遞給該存儲過程(chéng)的調用者(zhě),這樣在存儲過(guò)程執(zhí)行結(jié)束後,可以引用該(gāi)遊標變(biàn)量,在該種情況(kuàng)下,直到引用(yòng)該遊標的最後一個就是被釋放時,遊標才(cái)會(huì)自動釋放。
  • GLOBAL
    定義(yì)遊標(biāo)的作(zuò)用(yòng)域是整個會話層(céng)會話層指用戶的(de)連接時間它包(bāo)括從用戶登(dēng)錄(lù)到SQLSERVER 到脫離數(shù)據庫的整段時間。選擇GLOBAL 表(biǎo)明在整個會話層的(de)任何存(cún)儲過程、觸(chù)發器或批處理中(zhōng)都可(kě)以使用該遊標,隻有(yǒu)當用戶(hù)脫離數據庫、時該遊標才會被自動釋放。
    注意:如果既未使用(yòng)GLOBAL也未使用LOCAL,那(nà)麽SQL SERVER將使用(yòng)default local cursor數據庫選項,為了與以(yǐ)彰(zhāng)的版本歉容,該選(xuǎn)項(xiàng)常(cháng)設置為FALSE。
  • FORWARD_ONLY
    選項指明在從遊標中提取數據記錄時,隻能按照從(cóng)第一行到最後(hòu)一行(háng)的順(shùn)序,此時隻能選用FETCH NEXT 操作。除非使(shǐ)用STATIC, KEYSET 和DYNAMIC 關鍵字,否則(zé)如果未指明是(shì)使(shǐ)用(yòng)FORWARD_ONLY 還是使用(yòng)SCROLL, 那(nà)麽FORWARD_ONLY 將成為缺省選(xuǎn)項,因為若使用STATIC KEYSET 和(hé)DYNAMIC 關鍵字,則(zé)變成了SCROLL 遊標。另外如(rú)果(guǒ)使用了FORWARD_ONLY, 便不能使用FAST_FORWARD。
  • STATIC
    選項的含義(yì)與INSENSITIVE 選項一樣,MS SQL SERVER 會(huì)將遊標定義所選取出來(lái)的數據記(jì)錄存放在一(yī)臨時(shí)表內(建立(lì)在tempdb 數(shù)據(jù)庫下)。對該(gāi)遊標(biāo)的讀(dú)取操作皆由臨時表(biǎo)來應答。因此對基本表的修(xiū)改並不影響遊標中的數據,即遊標(biāo)不(bú)會隨著(zhe)基本表(biǎo)內容的(de)
    改變而改變,同(tóng)時也無法通過遊標來更新(xīn)基本表。
  • KEYSET
    指出(chū)當遊(yóu)標(biāo)被打(dǎ)開時(shí),遊標中列的順(shùn)序是(shì)固定的,並且(qiě)MS SQL SERVER 會在tempdb內建立一(yī)個表,該(gāi)表即為(wéi)KEYSET KEYSET 的(de)鍵值可惟一識別(bié)遊(yóu)標中(zhōng)的某行數據。當遊標(biāo)擁有(yǒu)者或其它用(yòng)戶對(duì)基(jī)本(běn)表中的非鍵值數據進行修改時(shí),這種變化能(néng)夠反映(yìng)到遊標中,所以(yǐ)遊標用戶或所有(yǒu)者(zhě)可以通過滾動遊(yóu)標提限這(zhè)些數據。

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

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

關鍵詞:SQL-SERVER

閱讀本文後您有什麽感想(xiǎng)? 已有 人給出評價!

  • 0 歡迎喜歡
  • 0 白(bái)癡
  • 0 拜托
  • 0 哇
  • 0 加油(yóu)
  • 0 鄙視