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

綠色(sè)資源網

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

SQL-SERVER 聲明遊(yóu)標

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

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

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

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

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

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

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

關鍵詞:SQL-SERVER

閱讀(dú)本文後您有什(shí)麽感想? 已有 人給出評價!

  • 0 歡迎喜歡
  • 0 白癡
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙視
免费人欧美成又黄又爽的视频丨一本色道久久88综合日韩精品丨国产专区日韩精品欧美色丨午夜无遮挡男女啪啪视频丨国产欧美日韩综合精品一区二区丨亚洲精品无码不卡在线播HE丨亚洲精品国产精品国自产观看丨日韩国产高清av不卡