時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
游標(Cursor)是處理數(shù)據(jù)的一種方法,為了查看或者處理結果集中的數(shù)據(jù),游標提供了在結果集中一次以行或者多行前進或向后瀏覽數(shù)據(jù)的能力。我們可以把游標當作一個指針,它可以指定結果中的任何位置,然后允許用戶對指定位置的數(shù)據(jù)進行處理。
1.游標的組成
游標包含兩個部分:一個是游標結果集、一個是游標位置。
游標結果集:定義該游標得SELECT語句返回的行的集合。游標位置:指向這個結果集某一行的當前指針。
2.游標的分類
游標共有3類:API服務器游標、Transaction-SQL游標和API客戶端游標。
其中前兩種游標都是運行在服務器上的,所以又叫做服務器游標。
API服務器游標
API服務器游標主要應用在服務上,當客戶端的應用程序調用API游標函數(shù)時,服務器會對API函數(shù)進行處理。使用API函數(shù)和方法可以實現(xiàn)如下功能:
(1)打開一個連接。
(2)設置定義游標特征的特性或屬性,API自動將游標影射到每個結果集。
(3)執(zhí)行一個或多個Transaction-SQL語句。
(4)使用API函數(shù)或方法提取結果集中的行。
API服務器游標包含以下四種:靜態(tài)游標、動態(tài)游標、只進游標、鍵集驅動游標(Primary key)
靜態(tài)游標的完整結果集將打開游標時建立的結果集存儲在臨時表中,(靜態(tài)游標始終是只讀的)。靜態(tài)游標具有以下特點:總是按照打開游標時的原樣顯示結果集;不反映數(shù)據(jù)庫中作的任何修改,也不反映對結果集行的列值所作的更改;不顯示打開游標后在數(shù)據(jù)庫中新插入的行;組成結果集的行被其他用戶更新,新的數(shù)據(jù)值不會顯示在靜態(tài)游標中;但是靜態(tài)游標會顯示打開游標以后從數(shù)據(jù)庫中刪除的行。
動態(tài)游標與靜態(tài)游標相反,當滾動游標時動態(tài)游標反映結果集中的所有更改。結果集中的行數(shù)據(jù)值、順序和成員每次提取時都會改變。
只進游標不支持滾動,它只支持游標從頭到尾順序提取數(shù)據(jù)行。注意:只進游標也反映對結果集所做的所有更改。
鍵集驅動游標同時具有靜態(tài)游標和動態(tài)游標的特點。當打開游標時,該游標中的成員以及行的順序是固定的,鍵集在游標打開時也會存儲到臨時工作表中,對非鍵集列的數(shù)據(jù)值的更改在用戶游標滾動的時候可以看見,在游標打開以后對數(shù)據(jù)庫中插入的行是不可見的,除非關閉重新打開游標。
Transaction-SQL游標
該游標是基于Declare Cursor 語法,主要用于Transaction-SQL腳本、存儲過程以及觸發(fā)器中。Transaction-SQL游標在服務器處理由客戶端發(fā)送到服務器的Transaction-SQL語句。
在存儲過程或觸發(fā)器中使用Transaction-SQL游標的過程為:
(1)聲明Transaction-SQL變量包含游標返回的數(shù)據(jù)。為每個結果集列聲明一個變量。聲明足夠大的變量來保存列返回的值,并聲明變量的類型為可從數(shù)據(jù)類型隱式轉換得到的數(shù)據(jù)類型。
(2)使用Declare Cursor語句將Transaction-SQL游標與Select語句相關聯(lián)。還可以利用Declare Cursor定義游標的只讀、只進等特性。
(3)使用Open語句執(zhí)行Select語句填充游標。
(4)使用Fetch Into語句提取單個行,并將每列中得數(shù)據(jù)移至指定的變量中。注意:其他Transaction-SQL語句可以引用那些變量來訪問提取的數(shù)據(jù)值。Transaction-SQL游標不支持提取行塊。
(5)使用Close語句結束游標的使用。注意:關閉游標以后,該游標還是存在,可以使用Open命令打開繼續(xù)使用,只有調用Deallocate語句才會完全釋放。
客戶端游標
該游標將使用默認結果集把整個結果集高速緩存在客戶端上,所有的游標操作都在客戶端的高速緩存中進行。注意:客戶端游標只支持只進和靜態(tài)游標。不支持其他游標。
3.游標的生命周期
游標的生命周期包含有五個階段:聲明游標、打開游標、讀取游標數(shù)據(jù)、關閉游標、釋放游標。
聲明游標是為游標指定獲取數(shù)據(jù)時所使用的Select語句,聲明游標并不會檢索任何數(shù)據(jù),它只是為游標指明了相應的Select 語句。
Declare 游標名稱 Cursor 參數(shù)
聲明游標的參數(shù)
(1)Local與Global:Local表示游標的作用于僅僅限于其所在的存儲過程、觸發(fā)器以及批處理中、執(zhí)行完畢以后游標自動釋放。Global表示的是該游標作用域是整個會話層。由連接執(zhí)行的任何存儲過程、批處理等都可以引用該游標名稱,僅在斷開連接時隱性釋放。
(2)Forward_only與Scroll:前者表示為只進游標,后者表示為可以隨意定位。默認為前者。
(3)Static、Keyset與Dynamic: 第一個表示定義一個游標,其數(shù)據(jù)存放到一個臨時表內,對游標的所有請求都從臨時表中應答,因此,對該游標進行提取操作時返回的數(shù)據(jù)不反映對基表所作的修改,并且該游標不允許修改。Keyset表示的是,當游標打開時,鍵集驅動游標中行的身份與順序是固定的,并把其放到臨時表中。Dynamic表示的是滾動游標時,動態(tài)游標反映對結果集內所有數(shù)據(jù)的更改。
(4)Read_only 、Scroll_Locks與Optimistic:第一個表示的是只讀游標,第二個表示的是在使用的游標結果集數(shù)據(jù)上放置鎖,當行讀取到游標中然后對它們進行修改時,數(shù)據(jù)庫將鎖定這些行,以保證數(shù)據(jù)的一致性。Optimistic的含義是游標將數(shù)據(jù)讀取以后,如果這些數(shù)據(jù)被更新了,則通過游標定位進行的更新與刪除操作將不會成功。
標準游標:
Declare MyCursor Cursor
For Select * From Master_Goods
只讀游標
Declare MyCusror Cursor
#p#副標題#e#
For Select * From Master_Goods
For Read Only
可更新游標
Declare MyCusror Cursor
For Select * From Master_Goods
For UpDate
打開游標使用Open語句用于打開Transaction-SQL服務器游標,執(zhí)行Open語句的過程中就是按照Select語句進行填充數(shù)據(jù),打開游標以后游標位置在第一行。
打開游標
全局游標:Open Global MyCursor 局部游標: Open MyCursor
讀取游標數(shù)據(jù):在打開游標以后,使用Fetch語句從Transaction-SQL服務器游標中檢索特定的一行。使用Fetch操作,可以使游標移動到下一個記錄,并將游標返回的每個列得數(shù)據(jù)分別賦值給聲明的本地變量。
Fetch [Next | Prior | First | Last | Absolute n | Relative n ] From MyCursor
Into @GoodsID,@GoodsName
其中:Next表示返回結果集中當前行的下一行記錄,如果第一次讀取則返回第一行。默認的讀取選項為Next
Prior表示返回結果集中當前行的前一行記錄,如果第一次讀取則沒有行返回,并且把游標置于第一行之前。
First表示返回結果集中的第一行,并且將其作為當前行。
Last表示返回結果集中的最后一行,并且將其作為當前行。
Absolute n 如果n為正數(shù),則返回從游標頭開始的第n行,并且返回行變成新的當前行。如果n為負,則返回從游標末尾開始的第n行,并且返回行為新的當前行,如果n為0,則返回當前行。
Relative n 如果n為正數(shù),則返回從當前行開始的第n行,如果n為負,則返回從當前行之前的第n行,如果為0,則返回當前行。
關閉游標調用的是Close語句,方式如下:Close Global MyCursor Close MyCursor
釋放游標調用的是Deallocate語句,方法如下:Deallocate Glboal MyCursor Deallocate MyCursor
游標實例:
以下為引用的內容: Declare MyCusror Cursor Scroll For Select * From Master_Goods Order By GoodsID Open MyCursor Fetch next From MyCursor While(@@Fetch_Status = 0) ?Begin 關鍵詞標簽:SQLServer 相關閱讀
熱門文章 淺談JSP JDBC來連接SQL Server 2005的方法 SqlServer2005對現(xiàn)有數(shù)據(jù)進行分區(qū)具體步驟 sql server系統(tǒng)表損壞的解決方法 MS-SQL2005服務器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構的關系 相關下載 人氣排行 配置和注冊ODBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠程備份(還原)SQL2000數(shù)據(jù)庫 SQL2000數(shù)據(jù)庫遠程導入(導出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫服務端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級到2000的正確操作步驟 sql server系統(tǒng)表損壞的解決方法 淺談JSP JDBC來連接SQL Server 2005的方法
|