版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、SQLSERVER游標(biāo)詳解游標(biāo)詳解游標(biāo)和游標(biāo)的優(yōu)點游標(biāo)和游標(biāo)的優(yōu)點在數(shù)據(jù)庫中,游標(biāo)是一個十分重要的概念。游標(biāo)提供了一種對從表中檢索出的數(shù)據(jù)進(jìn)行操作的靈活手在數(shù)據(jù)庫中,游標(biāo)是一個十分重要的概念。游標(biāo)提供了一種對從表中檢索出的數(shù)據(jù)進(jìn)行操作的靈活手段,就本質(zhì)而言,游標(biāo)實際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機制。游標(biāo)段,就本質(zhì)而言,游標(biāo)實際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機制。游標(biāo)總是與一條總是與一
2、條T_SQL選擇語句相關(guān)聯(lián)因為游標(biāo)由結(jié)果集(可以是零條、一條或由相關(guān)的選擇語句檢索出選擇語句相關(guān)聯(lián)因為游標(biāo)由結(jié)果集(可以是零條、一條或由相關(guān)的選擇語句檢索出的多條記錄)和結(jié)果集中指向特定記錄的游標(biāo)位置組成。當(dāng)決定對結(jié)果集進(jìn)行處理時,必須聲明一個指的多條記錄)和結(jié)果集中指向特定記錄的游標(biāo)位置組成。當(dāng)決定對結(jié)果集進(jìn)行處理時,必須聲明一個指向該結(jié)果集的游標(biāo)。如果曾經(jīng)用向該結(jié)果集的游標(biāo)。如果曾經(jīng)用C語言寫過對文件進(jìn)行處理的程序,那么游標(biāo)就像您打
3、開文件所得到的語言寫過對文件進(jìn)行處理的程序,那么游標(biāo)就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對于游標(biāo)而言,其道理是相同的。可文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對于游標(biāo)而言,其道理是相同的??梢娪螛?biāo)能夠?qū)崿F(xiàn)按與傳統(tǒng)程序讀取平面文件類似的方式處理來自基礎(chǔ)表的結(jié)果集,從而把表中數(shù)據(jù)以平見游標(biāo)能夠?qū)崿F(xiàn)按與傳統(tǒng)程序讀取平面文件類似的方式處理來自基礎(chǔ)表的結(jié)果集,從而把表中數(shù)據(jù)以平面文件
4、的形式呈現(xiàn)給程序。面文件的形式呈現(xiàn)給程序。我們知道關(guān)系數(shù)據(jù)庫管理系統(tǒng)實質(zhì)是面向集合的,在我們知道關(guān)系數(shù)據(jù)庫管理系統(tǒng)實質(zhì)是面向集合的,在MSSQLSERVER中并沒有一種描述表中單一中并沒有一種描述表中單一記錄的表達(dá)形式,除非使用記錄的表達(dá)形式,除非使用where子句來限制只有一條記錄被選中。因此我們必須借助于游標(biāo)來進(jìn)行面子句來限制只有一條記錄被選中。因此我們必須借助于游標(biāo)來進(jìn)行面向單條記錄的數(shù)據(jù)處理。向單條記錄的數(shù)據(jù)處理。由此可見,游標(biāo)
5、允許應(yīng)用程序?qū)Σ樵冋Z句由此可見,游標(biāo)允許應(yīng)用程序?qū)Σ樵冋Z句返回的行結(jié)果集中每一行進(jìn)行相同或不同的操作,而返回的行結(jié)果集中每一行進(jìn)行相同或不同的操作,而不是一次對整個結(jié)果集進(jìn)行同一種操作;它還提供對基于游標(biāo)位置而對表中數(shù)據(jù)進(jìn)行刪除或更新的能力;不是一次對整個結(jié)果集進(jìn)行同一種操作;它還提供對基于游標(biāo)位置而對表中數(shù)據(jù)進(jìn)行刪除或更新的能力;而且,正是游標(biāo)把作為面向集合的數(shù)據(jù)庫管理系統(tǒng)和面向行的程序設(shè)計兩者聯(lián)系起來,使兩個數(shù)據(jù)處理而且,正是游標(biāo)把
6、作為面向集合的數(shù)據(jù)庫管理系統(tǒng)和面向行的程序設(shè)計兩者聯(lián)系起來,使兩個數(shù)據(jù)處理方式能夠進(jìn)行溝通。方式能夠進(jìn)行溝通。游標(biāo)種類游標(biāo)種類MSSQLSERVER支持三種類型的游標(biāo):支持三種類型的游標(biāo):Transact_SQL游標(biāo),游標(biāo),API服務(wù)器游標(biāo)和客戶游標(biāo)。服務(wù)器游標(biāo)和客戶游標(biāo)。(1)Transact_SQL游標(biāo)游標(biāo)Transact_SQL游標(biāo)是由游標(biāo)是由DECLARECURS語法定義、主要用在語法定義、主要用在Transact_SQL腳本、
7、存儲過程腳本、存儲過程和觸發(fā)器中。和觸發(fā)器中。Transact_SQL游標(biāo)主要用在服務(wù)器上,由從客戶端發(fā)送給服務(wù)器的游標(biāo)主要用在服務(wù)器上,由從客戶端發(fā)送給服務(wù)器的Transact_SQL語句語句或是批處理、存儲過程、觸發(fā)器中的或是批處理、存儲過程、觸發(fā)器中的Transact_SQL進(jìn)行管理。進(jìn)行管理。Transact_SQL游標(biāo)不支持提取數(shù)據(jù)塊游標(biāo)不支持提取數(shù)據(jù)塊或多行數(shù)據(jù)?;蚨嘈袛?shù)據(jù)。(2)API游標(biāo)游標(biāo)API游標(biāo)支持在游標(biāo)支持在OL
8、EDB,ODBC以及以及DB_library中使用游標(biāo)函數(shù),主要用在服務(wù)器上。每一次客中使用游標(biāo)函數(shù),主要用在服務(wù)器上。每一次客戶端應(yīng)用程序調(diào)用戶端應(yīng)用程序調(diào)用API游標(biāo)函數(shù),游標(biāo)函數(shù),MSSQLSEVER的OLEDB提供者、提供者、ODBC驅(qū)動器或驅(qū)動器或DB_library的動態(tài)鏈接庫(的動態(tài)鏈接庫(DLL)都會將這些客戶請求傳送給服務(wù)器以對都會將這些客戶請求傳送給服務(wù)器以對API游標(biāo)進(jìn)行處理。游標(biāo)進(jìn)行處理。(3)客戶游標(biāo)客戶游標(biāo)客
9、戶游標(biāo)主要是當(dāng)在客戶機上緩存結(jié)果集時才使用。在客戶游標(biāo)中,有一個缺省的結(jié)果集被用來在客客戶游標(biāo)主要是當(dāng)在客戶機上緩存結(jié)果集時才使用。在客戶游標(biāo)中,有一個缺省的結(jié)果集被用來在客戶機上緩存整個結(jié)果集??蛻粲螛?biāo)僅支持靜態(tài)游標(biāo)而非動態(tài)游標(biāo)。由于服務(wù)器游標(biāo)并不支持所有的戶機上緩存整個結(jié)果集??蛻粲螛?biāo)僅支持靜態(tài)游標(biāo)而非動態(tài)游標(biāo)。由于服務(wù)器游標(biāo)并不支持所有的TransactSQL語句或批處理,所以客戶游標(biāo)常常僅被用作服務(wù)器游標(biāo)的輔助。因為在一般情況下
10、,服務(wù)語句或批處理,所以客戶游標(biāo)常常僅被用作服務(wù)器游標(biāo)的輔助。因為在一般情況下,服務(wù)器游標(biāo)能支持絕大多數(shù)的游標(biāo)操作。器游標(biāo)能支持絕大多數(shù)的游標(biāo)操作。由于由于API游標(biāo)和游標(biāo)和TransactSQL游標(biāo)使用在服務(wù)器端,所以被稱為服務(wù)器游標(biāo),也被稱為后臺游標(biāo),游標(biāo)使用在服務(wù)器端,所以被稱為服務(wù)器游標(biāo),也被稱為后臺游標(biāo),而客戶端游標(biāo)被稱為前臺游標(biāo)。在本章中我們主要講述服務(wù)器(后臺)游標(biāo)。而客戶端游標(biāo)被稱為前臺游標(biāo)。在本章中我們主要講述服務(wù)器(
11、后臺)游標(biāo)。每一個游標(biāo)必須有四個組成部分這四個關(guān)鍵部分必須符合下面的順序;每一個游標(biāo)必須有四個組成部分這四個關(guān)鍵部分必須符合下面的順序;1.DECLARE游標(biāo)游標(biāo)2.OPEN游標(biāo)游標(biāo)3.從一個游標(biāo)中從一個游標(biāo)中FETCH信息信息4.CLOSE或DEALLOCATE游標(biāo)游標(biāo)通常我們使用通常我們使用DECLARE來聲明一個游標(biāo)聲明一個游標(biāo)主要包括以下主要內(nèi)容:來聲明一個游標(biāo)聲明一個游標(biāo)主要包括以下主要內(nèi)容:游標(biāo)名字游標(biāo)名字?jǐn)?shù)據(jù)來源(表和列)
12、數(shù)據(jù)來源(表和列)庫選項,為了與以前的版本兼容,該選項常設(shè)置為庫選項,為了與以前的版本兼容,該選項常設(shè)置為FALSE。FWARD_ONLY選項指明在從游標(biāo)中提取數(shù)據(jù)記錄時,只能按照從第一行到最后一行的順序,此時只能選用選項指明在從游標(biāo)中提取數(shù)據(jù)記錄時,只能按照從第一行到最后一行的順序,此時只能選用FETCHNEXT操作。除非使用操作。除非使用STATIC,KEYSET和DYNAMIC關(guān)鍵字,否則如果未指明是使用關(guān)鍵字,否則如果未指明是使
13、用FWARD_ONLY還是使用還是使用SCROLL,那么那么FWARD_ONLY將成為缺省選項,因為若使用將成為缺省選項,因為若使用STATICKEYSET和DYNAMIC關(guān)鍵字,則變成了關(guān)鍵字,則變成了SCROLL游標(biāo)。另外如果使用了游標(biāo)。另外如果使用了FWARD_ONLY,便不能使用便不能使用FAST_FWARD。STATIC選項的含義與選項的含義與INSENSITIVE選項一樣,選項一樣,MSSQLSERVER會將游標(biāo)定義所選取出
14、來的數(shù)據(jù)記錄存放在會將游標(biāo)定義所選取出來的數(shù)據(jù)記錄存放在一臨時表內(nèi)(建立在一臨時表內(nèi)(建立在tempdb數(shù)據(jù)庫下)。對該游標(biāo)的讀取操作皆由臨時表來應(yīng)答。因此對基本表的修數(shù)據(jù)庫下)。對該游標(biāo)的讀取操作皆由臨時表來應(yīng)答。因此對基本表的修改并不影響游標(biāo)中的數(shù)據(jù),即游標(biāo)不會隨著基本表內(nèi)容的改變而改變,同時也無法通過游標(biāo)來更新基本改并不影響游標(biāo)中的數(shù)據(jù),即游標(biāo)不會隨著基本表內(nèi)容的改變而改變,同時也無法通過游標(biāo)來更新基本表。表。KEYSET指出當(dāng)游
15、標(biāo)被打開時,游標(biāo)中列的順序是固定的,并且指出當(dāng)游標(biāo)被打開時,游標(biāo)中列的順序是固定的,并且MSSQLSERVER會在會在tempdb內(nèi)建立一個表,內(nèi)建立一個表,該表即為該表即為KEYSET的鍵值可惟一識別游標(biāo)中的某行數(shù)據(jù)。當(dāng)游標(biāo)擁有者或其它用戶對基本表中的非鍵值的鍵值可惟一識別游標(biāo)中的某行數(shù)據(jù)。當(dāng)游標(biāo)擁有者或其它用戶對基本表中的非鍵值數(shù)據(jù)進(jìn)行修改時,這種變化能夠反映到游標(biāo)中,所以游標(biāo)用戶或所有者可以通過滾動游標(biāo)這顯示這些數(shù)數(shù)據(jù)進(jìn)行修改時,
16、這種變化能夠反映到游標(biāo)中,所以游標(biāo)用戶或所有者可以通過滾動游標(biāo)這顯示這些數(shù)據(jù)。據(jù)。當(dāng)其它用戶增加一條新的符合所定義的游標(biāo)范圍的數(shù)據(jù)時,無法由此游標(biāo)讀到該數(shù)據(jù)。因為當(dāng)其它用戶增加一條新的符合所定義的游標(biāo)范圍的數(shù)據(jù)時,無法由此游標(biāo)讀到該數(shù)據(jù)。因為TransactSQL服務(wù)器游標(biāo)不支持服務(wù)器游標(biāo)不支持語句。語句。如果在游標(biāo)中的某一行被刪除掉,那么當(dāng)通過游標(biāo)來提取該刪除行時,如果在游標(biāo)中的某一行被刪除掉,那么當(dāng)通過游標(biāo)來提取該刪除行時,@@FE
17、TCH_STATUS的返回的返回值為值為2。@@FETCH_STATUS是用來判斷讀取游標(biāo)是否成功的系統(tǒng)全局變量。是用來判斷讀取游標(biāo)是否成功的系統(tǒng)全局變量。由于更新操作包括兩部分:刪除原數(shù)據(jù)插入新數(shù)據(jù),所以如果讀取原數(shù)據(jù),由于更新操作包括兩部分:刪除原數(shù)據(jù)插入新數(shù)據(jù),所以如果讀取原數(shù)據(jù),@@FETCH_STATUS的返回值為返回值為2;而且無法通過游標(biāo)來讀取新插入的數(shù)據(jù)。但是如果使用了而且無法通過游標(biāo)來讀取新插入的數(shù)據(jù)。但是如果使用了W
18、HERECURRENTOF子句時,子句時,該新插入行數(shù)據(jù)便是可見的。該新插入行數(shù)據(jù)便是可見的。注意:如果基礎(chǔ)表未包含惟一的索引或主鍵,則一個注意:如果基礎(chǔ)表未包含惟一的索引或主鍵,則一個KEYSET游標(biāo)將回復(fù)成游標(biāo)將回復(fù)成STATIC游標(biāo)。游標(biāo)。DYNAMIC指明基礎(chǔ)表的變化將反映到游標(biāo)中,使用這個選項會最大程度上保證數(shù)據(jù)的一致性。然而,與指明基礎(chǔ)表的變化將反映到游標(biāo)中,使用這個選項會最大程度上保證數(shù)據(jù)的一致性。然而,與KEYSET和S
19、TATIC類型游標(biāo)相比較,此類型游標(biāo)需要大量的游標(biāo)資源。類型游標(biāo)相比較,此類型游標(biāo)需要大量的游標(biāo)資源。FAST_FWARD指明一個指明一個FWARD_ONLYREAD_ONLY型游標(biāo)。此選項已為執(zhí)行進(jìn)行了優(yōu)化。如果型游標(biāo)。此選項已為執(zhí)行進(jìn)行了優(yōu)化。如果SCROLL或F_UPDATE選項被定義,則選項被定義,則FAST_FWARD選項不能被定義。選項不能被定義。SCROLL_LOCKS指明鎖被放置在游標(biāo)結(jié)果集所使用的數(shù)據(jù)上。數(shù)據(jù)被讀入游標(biāo)
20、中時,就會出現(xiàn)鎖。這個選項確保對一個指明鎖被放置在游標(biāo)結(jié)果集所使用的數(shù)據(jù)上。數(shù)據(jù)被讀入游標(biāo)中時,就會出現(xiàn)鎖。這個選項確保對一個游標(biāo)進(jìn)行的更新和刪除操作總能被成功執(zhí)行。如果游標(biāo)進(jìn)行的更新和刪除操作總能被成功執(zhí)行。如果FAST_FWARD選項被定義,則不能選擇該選項。選項被定義,則不能選擇該選項。另外,由于數(shù)據(jù)被游標(biāo)鎖定,所以當(dāng)考慮數(shù)據(jù)并發(fā)處理時,應(yīng)避免使用該選項。另外,由于數(shù)據(jù)被游標(biāo)鎖定,所以當(dāng)考慮數(shù)據(jù)并發(fā)處理時,應(yīng)避免使用該選項。OPT
21、IMISTIC指明在數(shù)據(jù)被讀入游標(biāo)后,如果游標(biāo)中某行數(shù)據(jù)已發(fā)生變化,那么對游標(biāo)數(shù)據(jù)進(jìn)行更新或刪除可能會導(dǎo)指明在數(shù)據(jù)被讀入游標(biāo)后,如果游標(biāo)中某行數(shù)據(jù)已發(fā)生變化,那么對游標(biāo)數(shù)據(jù)進(jìn)行更新或刪除可能會導(dǎo)致失敗。如果使用了致失敗。如果使用了FAST_FWARD選項,則不能使用該選項。選項,則不能使用該選項。TYPE_WARNING指明若游標(biāo)類型被修改成與用戶定義的類型不同時,將發(fā)送一個警告信息給客戶端。指明若游標(biāo)類型被修改成與用戶定義的類型不同時
22、,將發(fā)送一個警告信息給客戶端。注意:不可以將注意:不可以將SQL_92的游標(biāo)語法規(guī)則與的游標(biāo)語法規(guī)則與MSSQLSERVER的游標(biāo)擴展用法混合在一起使用。的游標(biāo)擴展用法混合在一起使用。下面我們將總結(jié)一下聲明游標(biāo)時應(yīng)注意的一些問題。下面我們將總結(jié)一下聲明游標(biāo)時應(yīng)注意的一些問題。如果在如果在CURS前使用了前使用了SCROLL或INSENSITIVE保留字,則不能在保留字,則不能在CURS和F_statement之間使用任何的保留字。反之同
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- sql_server簡介外文翻譯
- sql-server 聲明游標(biāo)
- sql server游標(biāo)的使用
- sql_server數(shù)據(jù)庫課程標(biāo)準(zhǔn)
- sql_server數(shù)據(jù)類型一覽表
- sql_server數(shù)據(jù)庫課程設(shè)計_圖書館管理系統(tǒng)
- sql_server_2008_數(shù)據(jù)查詢_詳解
- sql 游標(biāo)
- sql游標(biāo)
- 客戶資源管理系統(tǒng)sql_server數(shù)據(jù)庫課程設(shè)計
- sql 游標(biāo)使用
- sql 游標(biāo)快速上手
- sql 游標(biāo) 數(shù)據(jù)庫
- sql server 2008試題
- sql游標(biāo)快速上手33401
- 游標(biāo)詳解
- sql server 實訓(xùn)作業(yè)
- sql server 2000觸發(fā)器
- using microsoft sql server efficiently on net
- sql server 常用數(shù)據(jù)類型
評論
0/150
提交評論