結果集,結果集就是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 scrollfor 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_cursorfetch relative 3 from orderNum_02_cursorfetch next from orderNum_02_cursorfetch absolute 4 from orderNum_02_cursorfetch next from orderNum_02_cursorfetch last from orderNum_02_cursor fetch prior from orderNum_02_cursorselect * from bigorder where orderNum='ZEORD003402'
結果(對比一下,就明白啦):
例子:
--提取數據賦值給變量declare @OrderId intfetch absolute 3 from orderNum_02_cursor into @OrderIdselect @OrderId as idselect * from bigorder where orderNum='ZEORD003402'
結果:
通過檢測全局變量@@Fetch_Status的值,獲得提取狀態信息,該狀態用于判斷Fetch語句返回數據的有效性。當執行一條Fetch語句之后,@@Fetch_Status可能出現3種值:0,Fetch語句成功。-1:Fetch語句失敗或行不在結果集中。-2:提取的行不存在。
這個狀態值可以幫你判斷提取數據的成功與否。
declare @OrderId intfetch absolute 3 from orderNum_02_cursor into @OrderIdwhile @@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 scrollfor 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 --修改當前行 end if @OrderId=154074 begin Delete bigorder Where Current of orderNum_03_cursor --刪除當前行 end fetch 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
新聞熱點
疑難解答