love fish大鵬一曰同風(fēng)起,扶搖直上九萬里

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          friends

          link

          最新評論

          mmsql游標(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ù)來源(表和列) 
          選取條件 
          屬性(僅讀或可修改)
          其語法格式如下:
          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 會將游標(biāo)定義所選取出來的數(shù)據(jù)記錄存放在一臨時(shí)表內(nèi)(建立在tempdb 數(shù)據(jù)庫下)。
          對該游標(biāo)的讀取操作皆由臨時(shí)表來應(yīng)答。因此,對基本表的修改并不影響游標(biāo)提取的數(shù)據(jù),即游標(biāo)不會隨著
          基本表內(nèi)容的改變而改變,同時(shí)也無法通過 游標(biāo)來更新基本表。如果不使用該保留字,那么對基本表的更新、刪除都會反映到游標(biāo)中。 另外應(yīng)該指出,當(dāng)遇到以下情況發(fā)生時(shí),游標(biāo)將自動(dòng)設(shè)定INSENSITIVE 選項(xiàng)。 在SELECT 語句中使用DISTINCT、 GROUP BY、 HAVING UNION 語句; 使用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īng)該注意的是,在游標(biāo)中不能使用COMPUTE、COMPU- TE BY、 FOR BROWSE、
          INTO 語句。 READ ONLY 表明不允許游標(biāo)內(nèi)的數(shù)據(jù)被更新盡管在缺省狀態(tài)下游標(biāo)是允許更新的。而且在UPDATE或DELETE 語句的
          WHERE CURRENT OF 子句中,不允許對該游標(biāo)進(jìn)行引用。 UPDATE [OF column_name[,…n]] 定義在游標(biāo)中可被修改的列,如果不指出要更新的列,那么所有的列都將被更新。
          當(dāng)游標(biāo)被成功創(chuàng)建后,游標(biāo)名成為該游標(biāo)的惟一標(biāo)識,如果在以后的存儲過程、觸發(fā)器或Transact_SQL
          腳本中使用游標(biāo),必須指定該游標(biāo)的名字。 LOCAL 定義游標(biāo)的作用域僅限在其所在的存儲過程、觸發(fā)器或批處理中。當(dāng)建立游標(biāo)的存儲過程執(zhí)行結(jié)束后,
          游標(biāo)會被自動(dòng)釋放。因此,我們常在存儲過程中使用OUTPUT 保留字,將游標(biāo)傳遞給該存儲過程的調(diào)用者,
          這樣在存儲過程執(zhí)行結(jié)束后,可以引用該游標(biāo)變量,在該種情況下,直到引用該游標(biāo)的最后一個(gè)就是被釋放時(shí),
          游標(biāo)才會自動(dòng)釋放。 GLOBAL 定義游標(biāo)的作用域是整個(gè)會話層會話層指用戶的連接時(shí)間它包括從用戶登錄到SQLSERVER 到脫離數(shù)據(jù)庫的整段時(shí)間。
          選擇GLOBAL 表明在整個(gè)會話層的任何存儲過程、觸發(fā)器或批處理中都可以使用該游標(biāo),只有當(dāng)用戶脫離數(shù)據(jù)庫、
          時(shí)該游標(biāo)才會被自動(dòng)釋放。 注意:如果既未使用GLOBAL也未使用LOCAL,那么SQL SERVER將使用default local cursor數(shù)據(jù)庫選項(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 會將游標(biāo)定義所選取出來的數(shù)據(jù)記錄存放在一臨時(shí)表內(nèi)
          (建立在tempdb 數(shù)據(jù)庫下)。對該游標(biāo)的讀取操作皆由臨時(shí)表來應(yīng)答。因此對基本表的修改并不影響游標(biāo)中的數(shù)據(jù),
          即游標(biāo)不會隨著基本表內(nèi)容的 改變而改變,同時(shí)也無法通過游標(biāo)來更新基本表。 KEYSET 指出當(dāng)游標(biāo)被打開時(shí),游標(biāo)中列的順序是固定的,并且MS SQL SERVER 會在tempdb內(nèi)建立一個(gè)表,該表即為KEYSET
          KEYSET 的鍵值可惟一識別游標(biāo)中的某行數(shù)據(jù)。當(dāng)游標(biāo)擁有者或其它用戶對基本表中的非鍵值數(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 語句。 如果在游標(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)會最大程度上保證數(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í),就會出現(xiàn)鎖。這個(gè)選項(xiàng)確保對一個(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ā)生變化,那么對游標(biāo)數(shù)據(jù)進(jìn)行更新或刪除可能會導(dǎo)致失敗。如果使
          用了FAST_FORWARD 選項(xiàng),則不能使用該選項(xiàng)。 TYPE_WARNING 指明若游標(biāo)類型被修改成與用戶定義的類型不同時(shí),將發(fā)送一個(gè)警告信息給客戶端。 注意:不可以將SQL_92的游標(biāo)語法規(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 語句不支持更新,則游標(biāo)為READ_ONLY; STATIC 和FAST_FORWARD 類型的游標(biāo)缺省為READ_ONLY; DYNAMIC 和KEYSET 游標(biāo)缺省為OPTIMISTIC。 我們僅能在Transact-SQL 語句中引用游標(biāo),而不能在數(shù)據(jù)庫API 函數(shù)中引用。 游標(biāo)被聲明以后,可以通過系統(tǒng)過程對其特性進(jìn)行設(shè)置。 對那些有權(quán)限對視圖、表或某些列執(zhí)行SELECT 語句的用戶而言,它也具有使用游標(biāo)的缺省權(quán)限。

          posted on 2006-09-30 16:30 liaojiyong 閱讀(635) 評論(0)  編輯  收藏 所屬分類: MSSQL

          主站蜘蛛池模板: 图片| 米林县| 阜城县| 财经| 马山县| 霍林郭勒市| 本溪| 金湖县| 九江县| 蒙城县| 上栗县| 萍乡市| 通城县| 桦甸市| 苗栗县| 昂仁县| 博兴县| 抚州市| 新邵县| 香河县| 鲁甸县| 阿拉善右旗| 唐河县| 图片| 宣恩县| 靖州| 黄山市| 佛坪县| 沧州市| 龙门县| 库车县| 鄂托克旗| 新兴县| 错那县| 呼图壁县| 抚远县| 金门县| 饶平县| 邓州市| 青冈县| 辽宁省|