提示:游標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,游標提供了在結果集中一次以行或者多行前進或向後浏覽數據的能力。我們可以把游標當作一個指針,它可以指定結果中的任何位置,然後允許用戶對指定位置的數據進行處理。 1.游標的組成 游標包含兩
游標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,游標提供了在結果集中一次以行或者多行前進或向後浏覽數據的能力。我們可以把游標當作一個指針,它可以指定結果中的任何位置,然後允許用戶對指定位置的數據進行處理。
1.游標的組成
游標包含兩個部分:一個是游標結果集、一個是游標位置。
游標結果集:定義該游標得SELECT語句返回的行的集合。游標位置:指向這個結果集某一行的當前指針。
2.游標的分類
游標共有3類:
API服務器游標
Transaction-SQL游標
API客戶端游標。
其中前兩種游標都是運行在服務器上的,所以又叫做服務器游標。
API服務器游標
API服務器游標主要應用在服務上,當客戶端的應用程序調用API游標函數時,服務器會對API函數進行處理。使用API函數和方法可以實現如下功能:
打開一個連接。
設置定義游標特征的特性或屬性,API自動將游標影射到每個結果集。
執行一個或多個Transaction-SQL語句。
使用API函數或方法提取結果集中的行。
API服務器游標包含以下四種:靜態游標、動態游標、只進游標、鍵集驅動游標(Primary key)
靜態游標的完整結果集將打開游標時建立的結果集存儲在臨時表中,(靜態游標始終是只讀的)。靜態游標具有以下特點:總是按照打開游標時的原樣顯示結果集;不反映數據庫中作的任何修改,也不反映對結果集行的列值所作的更改;不顯示打開游標後在數據庫中新插入的行;組成結果集的行被其他用戶更新,新的數據值不會顯示在靜態游標中;但是靜態游標會顯示打開游標以後從數據庫中刪除的行。
動態游標與靜態游標相反,當滾動游標時動態游標反映結果集中的所有更改。結果集中的行數據值、順序和成員每次提取時都會改變。
只進游標不支持滾動,它只支持游標從頭到尾順序提取數據行。注意:只進游標也反映對結果集所做的所有更改。
鍵集驅動游標同時具有靜態游標和動態游標的特點。當打開游標時,該游標中的成員以及行的順序是固定的,鍵集在游標打開時也會存儲到臨時工作表中,對非鍵集列的數據值的更改在用戶游標滾動的時候可以看見,在游標打開以後對數據庫中插入的行是不可見的,除非關閉重新打開游標。
Transaction-SQL游標
該游標是基於Declare Cursor 語法,主要用於Transaction-SQL腳本、存儲過程以及觸發器中。Transaction-SQL游標在服務器處理由客戶端發送到服務器的Transaction-SQL語句。
在存儲過程或觸發器中使用Transaction-SQL游標的過程為:
聲明Transaction-SQL變量包含游標返回的數據。為每個結果集列聲明一個變量。聲明足夠大的變量來保存列返回的值,並聲明變量的類型為可從數據類型隱式轉換得到的數據類型。
使用Declare Cursor語句將Transaction-SQL游標與Select語句相關聯。還可以利用Declare Cursor定義游標的只讀、只進等特性。
使用Open語句執行Select語句填充游標。
使用Fetch Into語句提取單個行,並將每列中得數據移至指定的變量中。注意:其他Transaction-SQL語句可以引用那些變量來訪問提取的數據值。Transaction-SQL游標不支持提取行塊。
使用Close語句結束游標的使用。注意:關閉游標以後,該游標還是存在,可以使用Open命令打開繼續使用,只有調用Deallocate語句才會完全釋放。
客戶端游標
該游標將使用默認結果集把整個結果集高速緩存在客戶端上,所有的游標操作都在客戶端的高速緩存中進行。注意:客戶端游標只支持只進和靜態游標。不支持其他游標。