IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫MSSQL → SQLServer 游標(biāo)簡介與使用說明

SQLServer 游標(biāo)簡介與使用說明

時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)

游標(biāo)(Cursor)是處理數(shù)據(jù)的一種方法,為了查看或者處理結(jié)果集中的數(shù)據(jù),游標(biāo)提供了在結(jié)果集中一次以行或者多行前進(jìn)或向后瀏覽數(shù)據(jù)的能力。我們可以把游標(biāo)當(dāng)作一個(gè)指針,它可以指定結(jié)果中的任何位置,然后允許用戶對指定位置的數(shù)據(jù)進(jìn)行處理。

1.游標(biāo)的組成

游標(biāo)包含兩個(gè)部分:一個(gè)是游標(biāo)結(jié)果集、一個(gè)是游標(biāo)位置。

游標(biāo)結(jié)果集:定義該游標(biāo)得SELECT語句返回的行的集合。游標(biāo)位置:指向這個(gè)結(jié)果集某一行的當(dāng)前指針。

2.游標(biāo)的分類

游標(biāo)共有3類:API服務(wù)器游標(biāo)、Transaction-SQL游標(biāo)和API客戶端游標(biāo)。

其中前兩種游標(biāo)都是運(yùn)行在服務(wù)器上的,所以又叫做服務(wù)器游標(biāo)。

API服務(wù)器游標(biāo)

API服務(wù)器游標(biāo)主要應(yīng)用在服務(wù)上,當(dāng)客戶端的應(yīng)用程序調(diào)用API游標(biāo)函數(shù)時(shí),服務(wù)器會對API函數(shù)進(jìn)行處理。使用API函數(shù)和方法可以實(shí)現(xiàn)如下功能:

(1)打開一個(gè)連接。

(2)設(shè)置定義游標(biāo)特征的特性或?qū)傩?,API自動將游標(biāo)影射到每個(gè)結(jié)果集。

(3)執(zhí)行一個(gè)或多個(gè)Transaction-SQL語句。

(4)使用API函數(shù)或方法提取結(jié)果集中的行。

API服務(wù)器游標(biāo)包含以下四種:靜態(tài)游標(biāo)、動態(tài)游標(biāo)、只進(jìn)游標(biāo)、鍵集驅(qū)動游標(biāo)(Primary key)

靜態(tài)游標(biāo)的完整結(jié)果集將打開游標(biāo)時(shí)建立的結(jié)果集存儲在臨時(shí)表中,(靜態(tài)游標(biāo)始終是只讀的)。靜態(tài)游標(biāo)具有以下特點(diǎn):總是按照打開游標(biāo)時(shí)的原樣顯示結(jié)果集;不反映數(shù)據(jù)庫中作的任何修改,也不反映對結(jié)果集行的列值所作的更改;不顯示打開游標(biāo)后在數(shù)據(jù)庫中新插入的行;組成結(jié)果集的行被其他用戶更新,新的數(shù)據(jù)值不會顯示在靜態(tài)游標(biāo)中;但是靜態(tài)游標(biāo)會顯示打開游標(biāo)以后從數(shù)據(jù)庫中刪除的行。

動態(tài)游標(biāo)與靜態(tài)游標(biāo)相反,當(dāng)滾動游標(biāo)時(shí)動態(tài)游標(biāo)反映結(jié)果集中的所有更改。結(jié)果集中的行數(shù)據(jù)值、順序和成員每次提取時(shí)都會改變。

只進(jìn)游標(biāo)不支持滾動,它只支持游標(biāo)從頭到尾順序提取數(shù)據(jù)行。注意:只進(jìn)游標(biāo)也反映對結(jié)果集所做的所有更改。

鍵集驅(qū)動游標(biāo)同時(shí)具有靜態(tài)游標(biāo)和動態(tài)游標(biāo)的特點(diǎn)。當(dāng)打開游標(biāo)時(shí),該游標(biāo)中的成員以及行的順序是固定的,鍵集在游標(biāo)打開時(shí)也會存儲到臨時(shí)工作表中,對非鍵集列的數(shù)據(jù)值的更改在用戶游標(biāo)滾動的時(shí)候可以看見,在游標(biāo)打開以后對數(shù)據(jù)庫中插入的行是不可見的,除非關(guān)閉重新打開游標(biāo)。

Transaction-SQL游標(biāo)

該游標(biāo)是基于Declare Cursor 語法,主要用于Transaction-SQL腳本、存儲過程以及觸發(fā)器中。Transaction-SQL游標(biāo)在服務(wù)器處理由客戶端發(fā)送到服務(wù)器的Transaction-SQL語句。

在存儲過程或觸發(fā)器中使用Transaction-SQL游標(biāo)的過程為:

(1)聲明Transaction-SQL變量包含游標(biāo)返回的數(shù)據(jù)。為每個(gè)結(jié)果集列聲明一個(gè)變量。聲明足夠大的變量來保存列返回的值,并聲明變量的類型為可從數(shù)據(jù)類型隱式轉(zhuǎn)換得到的數(shù)據(jù)類型。

(2)使用Declare Cursor語句將Transaction-SQL游標(biāo)與Select語句相關(guān)聯(lián)。還可以利用Declare Cursor定義游標(biāo)的只讀、只進(jìn)等特性。

(3)使用Open語句執(zhí)行Select語句填充游標(biāo)。

(4)使用Fetch Into語句提取單個(gè)行,并將每列中得數(shù)據(jù)移至指定的變量中。注意:其他Transaction-SQL語句可以引用那些變量來訪問提取的數(shù)據(jù)值。Transaction-SQL游標(biāo)不支持提取行塊。

(5)使用Close語句結(jié)束游標(biāo)的使用。注意:關(guān)閉游標(biāo)以后,該游標(biāo)還是存在,可以使用Open命令打開繼續(xù)使用,只有調(diào)用Deallocate語句才會完全釋放。

客戶端游標(biāo)

該游標(biāo)將使用默認(rèn)結(jié)果集把整個(gè)結(jié)果集高速緩存在客戶端上,所有的游標(biāo)操作都在客戶端的高速緩存中進(jìn)行。注意:客戶端游標(biāo)只支持只進(jìn)和靜態(tài)游標(biāo)。不支持其他游標(biāo)。

3.游標(biāo)的生命周期

游標(biāo)的生命周期包含有五個(gè)階段:聲明游標(biāo)、打開游標(biāo)、讀取游標(biāo)數(shù)據(jù)、關(guān)閉游標(biāo)、釋放游標(biāo)。

聲明游標(biāo)是為游標(biāo)指定獲取數(shù)據(jù)時(shí)所使用的Select語句,聲明游標(biāo)并不會檢索任何數(shù)據(jù),它只是為游標(biāo)指明了相應(yīng)的Select 語句。

Declare 游標(biāo)名稱 Cursor 參數(shù)

聲明游標(biāo)的參數(shù)

(1)Local與Global:Local表示游標(biāo)的作用于僅僅限于其所在的存儲過程、觸發(fā)器以及批處理中、執(zhí)行完畢以后游標(biāo)自動釋放。Global表示的是該游標(biāo)作用域是整個(gè)會話層。由連接執(zhí)行的任何存儲過程、批處理等都可以引用該游標(biāo)名稱,僅在斷開連接時(shí)隱性釋放。

(2)Forward_only與Scroll:前者表示為只進(jìn)游標(biāo),后者表示為可以隨意定位。默認(rèn)為前者。

(3)Static、Keyset與Dynamic: 第一個(gè)表示定義一個(gè)游標(biāo),其數(shù)據(jù)存放到一個(gè)臨時(shí)表內(nèi),對游標(biāo)的所有請求都從臨時(shí)表中應(yīng)答,因此,對該游標(biāo)進(jìn)行提取操作時(shí)返回的數(shù)據(jù)不反映對基表所作的修改,并且該游標(biāo)不允許修改。Keyset表示的是,當(dāng)游標(biāo)打開時(shí),鍵集驅(qū)動游標(biāo)中行的身份與順序是固定的,并把其放到臨時(shí)表中。Dynamic表示的是滾動游標(biāo)時(shí),動態(tài)游標(biāo)反映對結(jié)果集內(nèi)所有數(shù)據(jù)的更改。

(4)Read_only 、Scroll_Locks與Optimistic:第一個(gè)表示的是只讀游標(biāo),第二個(gè)表示的是在使用的游標(biāo)結(jié)果集數(shù)據(jù)上放置鎖,當(dāng)行讀取到游標(biāo)中然后對它們進(jìn)行修改時(shí),數(shù)據(jù)庫將鎖定這些行,以保證數(shù)據(jù)的一致性。Optimistic的含義是游標(biāo)將數(shù)據(jù)讀取以后,如果這些數(shù)據(jù)被更新了,則通過游標(biāo)定位進(jìn)行的更新與刪除操作將不會成功。

標(biāo)準(zhǔn)游標(biāo):

Declare MyCursor Cursor

For Select * From Master_Goods

只讀游標(biāo)

Declare MyCusror Cursor

#p#副標(biāo)題#e#

For Select * From Master_Goods

For Read Only

可更新游標(biāo)

Declare MyCusror Cursor

For Select * From Master_Goods

For UpDate

打開游標(biāo)使用Open語句用于打開Transaction-SQL服務(wù)器游標(biāo),執(zhí)行Open語句的過程中就是按照Select語句進(jìn)行填充數(shù)據(jù),打開游標(biāo)以后游標(biāo)位置在第一行。

打開游標(biāo)

全局游標(biāo):Open Global MyCursor 局部游標(biāo): Open MyCursor

讀取游標(biāo)數(shù)據(jù):在打開游標(biāo)以后,使用Fetch語句從Transaction-SQL服務(wù)器游標(biāo)中檢索特定的一行。使用Fetch操作,可以使游標(biāo)移動到下一個(gè)記錄,并將游標(biāo)返回的每個(gè)列得數(shù)據(jù)分別賦值給聲明的本地變量。

Fetch [Next | Prior | First | Last | Absolute n | Relative n ] From MyCursor

Into @GoodsID,@GoodsName

其中:Next表示返回結(jié)果集中當(dāng)前行的下一行記錄,如果第一次讀取則返回第一行。默認(rèn)的讀取選項(xiàng)為Next

Prior表示返回結(jié)果集中當(dāng)前行的前一行記錄,如果第一次讀取則沒有行返回,并且把游標(biāo)置于第一行之前。

First表示返回結(jié)果集中的第一行,并且將其作為當(dāng)前行。

Last表示返回結(jié)果集中的最后一行,并且將其作為當(dāng)前行。

Absolute n 如果n為正數(shù),則返回從游標(biāo)頭開始的第n行,并且返回行變成新的當(dāng)前行。如果n為負(fù),則返回從游標(biāo)末尾開始的第n行,并且返回行為新的當(dāng)前行,如果n為0,則返回當(dāng)前行。

Relative n 如果n為正數(shù),則返回從當(dāng)前行開始的第n行,如果n為負(fù),則返回從當(dāng)前行之前的第n行,如果為0,則返回當(dāng)前行。

關(guān)閉游標(biāo)調(diào)用的是Close語句,方式如下:Close Global MyCursor Close MyCursor

釋放游標(biāo)調(diào)用的是Deallocate語句,方法如下:Deallocate Glboal MyCursor Deallocate MyCursor

游標(biāo)實(shí)例:

以下為引用的內(nèi)容:

Declare MyCusror Cursor Scroll

For Select * From Master_Goods Order By GoodsID

Open MyCursor

Fetch next From MyCursor
Into @GoodsCode,@GoodsName

While(@@Fetch_Status = 0)
Begin

?Begin
?Select @GoodsCode = Convert(Char(20),@GoodsCode)
?Select @GoodsName = Convert(Char(20),@GoodsName)
????

關(guān)鍵詞標(biāo)簽:SQLServer

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 淺談JSP JDBC來連接SQL Server 2005的方法 淺談JSP JDBC來連接SQL Server 2005的方法 SqlServer2005對現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 SqlServer2005對現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表損壞的解決方法 sql server系統(tǒng)表損壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構(gòu)的關(guān)系 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構(gòu)的關(guān)系

相關(guān)下載

    人氣排行 配置和注冊O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫 SQL2000數(shù)據(jù)庫遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級到2000的正確操作步驟 sql server系統(tǒng)表損壞的解決方法 淺談JSP JDBC來連接SQL Server 2005的方法

    <kbd id="yxgek"></kbd>
  • <s id="yxgek"><delect id="yxgek"></delect></s>

    <source id="yxgek"><optgroup id="yxgek"></optgroup></source>