什麼是游標
結果集,結果集就是select查詢之後返回的所有行資料的集合。
游標則是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多資料進行讀寫,也可以移動游標定位到你所需要的行中進行運算元據。
一般複雜的儲存過程,都會有游標的出現,他的用處主要有:
定位到結果集中的某一行。
對當前位置的資料進行讀寫。
可以對結果集中的資料單獨操作,而不是整行執行相同的操作。
是面向集合的資料庫管理系統和面向行的程式設計之間的橋梁。
游標的分類
根據游標檢測結果集變化的能力和消耗資源的情況不同,sql server支援的api伺服器游標分為一下4種:
靜態游標在滾動時檢測不到表資料變化,但消耗的資源相對很少。動態游標在滾動時能檢測到所有表資料變化,但消耗的資源卻較多。鍵集驅動游標則處於他們中間,所以根據需求建立適合自己的游標,避免資源浪費。
游標的生命週期
游標的生命週期包含有五個階段:宣告游標、開啟游標、讀取游標資料、關閉游標、釋放游標。
1.宣告游標,語法
declare cursor_name cursor [ local | global ]
[ forward_only | scroll ]
[ static | keyset | dynamic | fast_forward ]
[ read_only | scroll_locks | optimistic ]
[ type_warning ]
for select_statement
[ for update [ of column_name [ ,...n ] ] ]
引數說明:
2.宣告乙個動態游標
declare ordernum_02_cursor cursor scroll
for select orderid from bigorder where ordernum='zeord003402'
3.開啟游標
--開啟游標語法
open [ global ] cursor_name | cursor_variable_name
cursor_name:游標名,cursor_variable_name:游標變數名稱,該變數引用了乙個游標。
--開啟游標
open ordernum_02_cursor
4.提取資料
--提取游標語法
fetch
[ [next|prior|frist|last|absoute n|relative n ]
from ]
[global] cursor_name
[into @variable_name[,....]]
引數說明:
--提取資料
fetch first from ordernum_02_cursor
fetch relative 3 from ordernum_02_cursor
fetch next from ordernum_02_cursor
fetch absolute 4 from ordernum_02_cursor
fetch next from ordernum_02_cursor
fetch last from ordernum_02_cursor
fetch prior from ordernum_02_cursor
select * from bigorder where ordernum='zeord003402'
結果(對比一下,就明白啦):
例子:
--提取資料賦值給變數
declare @orderid int
fetch absolute 3 from ordernum_02_cursor into @orderid
select @orderid as id
select * from bigorder where ordernum='zeord003402'
結果:![](https://pic.w3help.cc/a2c/6c45fe07023c98c87117bee9b7ca2.jpeg)
通過檢測全域性變數@@fetch_status的值,獲得提取狀態資訊,該狀態用於判斷fetch語句返回資料的有效性。當執行一條fetch語句之後,@@fetch_status可能出現3種值:0,fetch語句成功。-1:fetch語句失敗或行不在結果集中。-2:提取的行不存在。
這個狀態值可以幫你判斷提取資料的成功與否。
declare @orderid int
fetch absolute 3 from ordernum_02_cursor into @orderid
while @@fetch_status=0 --提取成功,進行下一條資料的提取操作
begin
select @orderid as id
fetch next from ordernum_02_cursor into @orderid --移動游標
end
5.利用游標更新刪除資料
--游標修改當前資料語法
update 基表名 set 列名=值[,...] where current of 游標名
--游標刪除當前資料語法
delete 基表名 where current of 游標名
---游標更新刪除當前資料
---1.宣告游標
declare ordernum_03_cursor cursor scroll
for select orderid ,userid from bigorder where ordernum='zeord003402'
--2.開啟游標
open ordernum_03_cursor
--3.宣告游標提取資料所要存放的變數
declare @orderid int ,@userid varchar(15)
--4.定位游標到哪一行
fetch first from ordernum_03_cursor into @orderid,@userid --into的變數數量必須與游標查詢結果集的列數相同
while @@fetch_status=0 --提取成功,進行下一條資料的提取操作
begin
if @orderid=122182
begin
update bigorder set userid='123' where current of ordernum_03_cursor --修改當前行
endif @orderid=154074
begin
delete bigorder where current of ordernum_03_cursor --刪除當前行
endfetch next from ordernum_03_cursor into @orderid ,@userid --移動游標
end
6.關閉游標
--關閉游標語法
close [ global ] cursor_name | cursor_variable_name
--關閉游標
close ordernum_03_cursor
7.刪除游標
--釋放游標語法
deallocate [ global ] cursor_name | cursor_variable_name
--釋放游標
deallocate ordernum_03_cursor
SQL Server 游標使用
游標概念 資料庫操作中我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。游標 cursor 是系統為使用者開設的乙個資料緩衝區,存放sql語句的執行結果。每個游標區都有乙個名字。使用者可以用sql語句逐一從游標中獲取記錄,並賦...
sqlserver游標使用
create procedure pk test as 宣告2個變數 declare o id nvarchar 20 declare a salary float 宣告乙個游標mycursor,select語句中引數的個數必須要和從游標取出的變數名相同 declare mycursor curso...
SQL Server 游標使用
1.宣告游標 declare 游標名 cursor select語句 注 此處一定是select語句 2.開啟游標 open 游標名 3.讀取游標資料 fetch next prior first last absolute n relative n from 游標名 into name1,name...