程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 數據庫的維護(四)__游標(cursor)

SQL Server 數據庫的維護(四)__游標(cursor)

編輯:關於SqlServer

--維護數據庫--


 


 

--游標(cursor)--

--概述:

注:使用select語句查詢結果的結果集是一個整體,如果想每次處理一行或一部分行數據,游標可以提供這種處理機制。可以將游標理解為指針。指針指向哪條記錄,哪條記錄即是被操作記錄。

游標處理結果集的方式:

1)允許定位在結果集的指定位置行。

2)從結果集的當前位置檢索一行或一部分行記錄。

3)支持對結果集當前位置做數據修改、刪除等操作。

 

--使用游標

注:使用游標定位和操作數據記錄的一般步驟為:聲明游標、打開游標、抽取數據、關閉游標和釋放游標。

--聲明游標 (declare … cursor)

注:聲明游標跟聲明變量相似,用declare命令。

declare 游標名 cursor --declare表示聲明游標名,cursor表示游標含義

[forward_only] [scroll] [read_only] [dynamic] --可選項forward_only表示游標為只進游標。可選項read_only定義游標為只讀游標。可選項scroll表示可以使用所有抽取數據的選項。可選項dynamic表示游標結果集中的數據可以修改。

for select語句 [for update [of 字段名 [ , ...] ] ] --select語句指能夠查詢到結果集的查詢語句,其中不能包含compute、compute by和into語句。要對結果集中做update修改操作時,可以使用of字段名來指明允許被修改的字段名,如果不使用of指定字段名,則所有字段都修改。

 

--打開游標

open 游標名 --open命令表示打開。“游標名”必須是已定義的、且沒有在使用的游標。剛打開游標,指針指向結果集中第一條記錄之前。

全局標量@@error可以判斷游標是否打開成功,如果返回0只則說明成功,否則失敗。

全局變量@@cursor_rows可以返回被打開的游標中記錄個數。

 

--抽取游標

fetch [first | prior | next | last | absolute {n|@變量} | relative {n|@變量} ] --fetch命令表示抽取數據,一次只能抽取一條記錄。

[from] 游標名 [into @變量名 [, ...] ] --into@變量名,...把抽取出的字段值賦值給指定變量,然後使用。

--first命令用來抽取結果集中的第一條記錄,並定位指針。

--prior命令用來抽取當前記錄的前一條記錄,並定位指針。如果當前記錄為結果集中的第一條記錄,prior命令則使指針上移至第一條記錄上方,並不會抽取結果。

--next命令用來抽取當前記錄的後一條記錄,並定位指針。新打開的數據庫使用next抽取出結果集中第一行記錄。如果結果集中最後一行記錄為當前記錄,next則使指針指向最後一條記錄下方,並不會抽取出結果。

--last命令用來抽取結果集中的最後一條記錄,並定位指針。

--absolute {n|@變量},當n(或@變量)為正數時,返回結果集中從頭開始的第n(或@變量)條記錄,並定位指針;當n(或@變量)為負數時,返回結果集中從末尾開始的第n(或@變量)條記錄,並定位指針。

--relative {n|@變量},當n(或@變量)為正數時,返回結果集中從當前行開始向下的第n(或@變量)條記錄,並定位指針;當n(或@變量)為負數時,返回結果集中從末尾開始的第n(或@變量)條記錄,並定位指針。

--可以使用全局變量@@fetch_status的值來判斷fetch命令是否抽取到數據。值為0表示抽取到記錄值為-1表示指針指向結果集最後一條記錄下方值為-2表示抽取操作存在問題

 

--關閉游標

close 游標名 --游標關閉後不能使用fetch命令抽取游標中的記錄,除非再次使用open命令(打開)重新打開。

 

--釋放游標

deallocate 游標名 --被釋放後的游標不能再使用open命令打開使用,除非使用declare命令(聲明)重新定義。

例:(***下面是一個幫助理解的案例***)(逐條查看“商品管理數據庫”的“銷售信息表”中2012年12月20日的銷售信息)

use 商品管理數據庫

go

set nocount on

--聲明游標

declare c_銷售表_日期 cursor

for

select 商品信息表.商品編號,商品信息表.商品名稱,銷售金額 from 商品信息表,銷售信息表 where 商品信息表.商品編號=銷售信息表.商品編號

and 銷售日期='2012-12-20'

--打開游標

open c_銷售表_日期

--抽取數據

begin

print '=====2012年12月20日銷售信息====='

declare @pdno nchar(8),@pdname nvarchar(10), @salemoney decimal(17,2)

--抽取第一條記錄,並將抽取到的變量賦值給相應變量

fetch next from c_銷售表_日期 into @pdno,@pdname,@salemoney

--使用全局變量@@fetch_status值是否為0作為循環判斷條件,檢驗是否抽取到記錄,如抽取到就在循環體內輸出抽取到的值,

--再繼續使用fetch命令抽取數據,直到@@FETCH_STATUS的值不為0為止

while(@@FETCH_STATUS=0)

begin

print '商品編號:'+@pdno+' 商品名稱:'+@pdname+' 銷售金額:'+convert(nchar(25),@salemoney)

fetch next from c_銷售表_日期 into @pdno,@pdname,@salemoney

end

end

--關閉游標

close c_銷售表_日期

--釋放游標

deallocate c_銷售表_日期

set nocount off

go
理解例子 

 注:"--"可看成說明或者注釋文本

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved