--維護數據庫--
--游標(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理解例子
注:"--"可看成說明或者注釋文本