什麼是游標 結果集,結果集就是select查詢之後返回的所有行數據的集合。 游標則是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多數據進行讀寫,也可以移動游標定位到你所需要的行中進行操作數據。 一般複雜的存儲過程,都會有游標的出現,他的用處主要有: 定位到結果集中的某一行。 對當前位置的數 ...
什麼是游標
結果集,結果集就是select查詢之後返回的所有行數據的集合。
游標則是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多數據進行讀寫,也可以移動游標定位到你所需要的行中進行操作數據。
一般複雜的存儲過程,都會有游標的出現,他的用處主要有:
- 定位到結果集中的某一行。
- 對當前位置的數據進行讀寫。
- 可以對結果集中的數據單獨操作,而不是整行執行相同的操作。
- 是面向集合的資料庫管理系統和麵向行的程式設計之間的橋梁。
游標使用三步曲:第一步創建游標,第二步打開游標,第三步使用游標。
游標使用
第一步創建游標
語法
--聲明資料庫引用
use 資料庫名;
go
--創建游標
declare cursor_name [insensitive] [scroll] cursor
for select_statement
[for { read only | update [of column_name [,......n] ] } ];
語法註釋
--cursor_name
--Transact-SQL伺服器游標定義的名稱。cursor_name必須符合有關標識符的規則。
--insensitive
--定義一個游標,以創建將由該游標使用的數據的臨時副本。對游標的所有請求都從tempdb中的這一臨時表中得到應答;
--因此,在對該游標進行提取操作時返回的數據中不反映對基表所做的修改,並且該游標不允許修改。
--使用ISO語法時,如果省略insensitive,則已提交的(任何用戶)對基礎表的刪除和更新則會反映在後面的提取操作中。
--scroll
--指定所有的提取選項(first、last、prior、next、relative和absolute)均可用。 如果未在iso declare cursor中指定scroll,則next是唯一支持的提取選項。
--如果還指定了fast_forward,則無法指定scroll。
--select_statement
--是定義游標結果集的標準select語句。在游標聲明的select_statement中不允許使用關鍵字for browse和into。
--如果select_statement中的子句與所請求的游標類型的功能有衝突,則SQLServer會將游標隱式轉換為其他類型。
--read only
--禁止通過該游標進行更新。無法在update或delete語句的where current of子句中引用游標。該選項優先於要更新的游標的預設功能。
--update [of column_name [,...n]]
--定義游標中可更新的列。如果指定了of <column_name> [, <... n>],則只允許修改所列出的列。 如果指定了update,但未指定列的列表,則可以更新所有列。
示例
--聲明資料庫引用
use testss;
go
--第一種ISO語法
--游標使用三步曲
--第一步聲明游標
declare synae_cursor_name insensitive scroll cursor
for select id,name from test1
for read only;
示例結果
第二步打開游標
語法
open { { [ global ] cursor_name } | cursor_variable_name }
語法解析
--global
--指定cursor_name是指全局游標。
--cursor_name
--已聲明的游標的名稱。當同時存在以cursor_name作為名稱的全局游標和局部游標時,如果指定global,則cursor_name是指全局游標;否則,cursor_name是指局部游標。
--cursor_variable_name
--游標變數的名稱,該變數引用一個游標。
示例
open global synae_cursor_name;
示例結果
第三步使用游標
語法
fetch [ [ next | prior | first | last | absolute { n | @nvar } | relative { n | @nvar } ] from ]
{ { [ global ] cursor_name } | @cursor_variable_name }
[ into @variable_name [ ,...n ] ]
語法註釋
--next
--緊跟當前行返回結果行,並且當前行遞增為返回行。如果fetch next為對游標的第一次提取操作,則返回結果集中的第一行。next為預設的游標提取選項。
--prior
--返回緊鄰當前行前面的結果行,並且當前行遞減為返回行。如果fetch prior為對游標的第一次提取操作,則沒有行返回並且游標置於第一行之前。
--first
--返回游標中的第一行並將其作為當前行。
--last
--返回游標中的最後一行並將其作為當前行。
--absolute { n| @nvar}
--如果 n 或 @nvar 為正,則返回從游標起始處開始向後的第 n 行,並將返回行變成新的當前行。
--如果 n 或 @nvar 為負,則返回從游標末尾處開始向前的第 n 行,並將返回行變成新的當前行。
--如果 n 或 @nvar 為 0,則不返回行。 n 必須是整數常量,並且 @nvar 必須是 smallint、tinyint 或 int。
--relative { n| @nvar}
--如果 n 或 @nvar 為正,則返回從當前行開始向後的第 n 行,並將返回行變成新的當前行。
--如果 n 或 @nvar 為負,則返回從當前行開始向前的第 n 行,並將返回行變成新的當前行。
--如果 n 或 @nvar 為 0,則返回當前行。 在對游標進行第一次提取時,
--如果在將 n 或 @nvar 設置為負數或 0 的情況下指定fetch relative,則不返回行。 n 必須是整數常量,並且 @nvar 必須是 smallint、tinyint 或 int。
--global
--指定 cursor_name 是指全局游標。
--cursor_name
--要從中進行提取的開放游標的名稱。 當同時存在以 cursor_name 作為名稱的全局游標和局部游標時,
--如果指定global,則 cursor_name 指全局游標,如果未指定 global,則指局部游標。
--@cursor_variable_name
--游標變數名,引用要從中進行提取操作的打開的游標。
--into @variable_name[ ,...n]
--允許將提取操作的列數據放到局部變數中。 列表中的各個變數從左到右與游標結果集中的相應列相關聯。
--各變數的數據類型必須與相應的結果集列的數據類型匹配,或是結果集列數據類型所支持的隱式轉換。 變數的數目必須與游標選擇列表中的列數一致。
示例
declare @id nvarchar(50),@name nvarchar(50);
fetch last from synae_cursor_name into @id,@name;
select @id,@name;
示例結果
游標使用擴展
查看游標
語法
exec sp_cursor_list [ @cursor_return = ] cursor_variable_name output, [ @cursor_scope = ] cursor_scope [;]
語法解析
--[@cursor_return=] cursor_variable_name 輸出
--已聲明的游標變數的名稱。 cursor_variable_name是游標,無預設值。 游標是可滾動、 動態、 只讀游標。
--[ @cursor_scope=] cursor_scope
--指定要報告的游標級別。 cursor_scope是int,無預設值,並且可以是下列值之一。
--@cursor_scope=1(local)(報告所有本地游標)
--@cursor_scope=2(global)(報告所有全局游標)
--@cursor_scope=3(global和local)(報告本地游標和全局游標)
示例
declare @result cursor
exec sp_cursor_list @cursor_return=@result output,@cursor_scope=2;
fetch next from @result;
示例結果
關閉游標
語法
close { { [ global ] cursor_name } | cursor_variable_name }
語法解析
--global
--指定cursor_name是指全局游標。
--cursor_name
--打開的游標的名稱。 當同時存在以cursor_name作為名稱的全局游標和局部游標時,如果指定global,則cursor_name 是指全局游標;否則,cursor_name 是指局部游標。
--cursor_variable_name
--與打開的游標關聯的游標變數的名稱。
示例
close global synae_cursor_name;
示例結果
刪除游標
語法
deallocate { { [ global ] cursor_name } | @cursor_variable_name }
語法解析
--cursor_name
--已聲明游標的名稱。 當同時存在以 cursor_name 作為名稱的全局游標和局部游標時,如果指定 GLOBAL,則 cursor_name 指全局游標,如果未指定 GLOBAL,則指局部游標。
--@cursor_variable_name
--cursor 變數的名稱。 @cursor_variable_name必須為cursor類型。
示例
deallocate global synae_cursor_name;
示例結果