SQL Server 数据库的维护(四)__游标(cursor)
--維護(hù)數(shù)據(jù)庫(kù)--
?
?
--游標(biāo)(cursor)--
--概述:
注:使用select語(yǔ)句查詢(xún)結(jié)果的結(jié)果集是一個(gè)整體,如果想每次處理一行或一部分行數(shù)據(jù),游標(biāo)可以提供這種處理機(jī)制。可以將游標(biāo)理解為指針。指針指向哪條記錄,哪條記錄即是被操作記錄。
游標(biāo)處理結(jié)果集的方式:
1)允許定位在結(jié)果集的指定位置行。
2)從結(jié)果集的當(dāng)前位置檢索一行或一部分行記錄。
3)支持對(duì)結(jié)果集當(dāng)前位置做數(shù)據(jù)修改、刪除等操作。
?
--使用游標(biāo)
注:使用游標(biāo)定位和操作數(shù)據(jù)記錄的一般步驟為:聲明游標(biāo)、打開(kāi)游標(biāo)、抽取數(shù)據(jù)、關(guān)閉游標(biāo)和釋放游標(biāo)。
--聲明游標(biāo)?(declare … cursor)
注:聲明游標(biāo)跟聲明變量相似,用declare命令。
declare 游標(biāo)名 cursor --declare表示聲明游標(biāo)名,cursor表示游標(biāo)含義
[forward_only] [scroll] [read_only] [dynamic] --可選項(xiàng)forward_only表示游標(biāo)為只進(jìn)游標(biāo)。可選項(xiàng)read_only定義游標(biāo)為只讀游標(biāo)。可選項(xiàng)scroll表示可以使用所有抽取數(shù)據(jù)的選項(xiàng)。可選項(xiàng)dynamic表示游標(biāo)結(jié)果集中的數(shù)據(jù)可以修改。
for select語(yǔ)句 [for update [of 字段名 [ , ...] ] ] --select語(yǔ)句指能夠查詢(xún)到結(jié)果集的查詢(xún)語(yǔ)句,其中不能包含compute、compute by和into語(yǔ)句。要對(duì)結(jié)果集中做update修改操作時(shí),可以使用of字段名來(lái)指明允許被修改的字段名,如果不使用of指定字段名,則所有字段都修改。
?
--打開(kāi)游標(biāo)
open 游標(biāo)名 --open命令表示打開(kāi)。“游標(biāo)名”必須是已定義的、且沒(méi)有在使用的游標(biāo)。剛打開(kāi)游標(biāo),指針指向結(jié)果集中第一條記錄之前。
全局標(biāo)量@@error可以判斷游標(biāo)是否打開(kāi)成功,如果返回0只則說(shuō)明成功,否則失敗。
全局變量@@cursor_rows可以返回被打開(kāi)的游標(biāo)中記錄個(gè)數(shù)。
?
--抽取游標(biāo)
fetch [first | prior | next | last | absolute {n|@變量} | relative {n|@變量} ] --fetch命令表示抽取數(shù)據(jù),一次只能抽取一條記錄。
[from] 游標(biāo)名 [into @變量名 [, ...] ] --into@變量名,...把抽取出的字段值賦值給指定變量,然后使用。
--first命令用來(lái)抽取結(jié)果集中的第一條記錄,并定位指針。
--prior命令用來(lái)抽取當(dāng)前記錄的前一條記錄,并定位指針。如果當(dāng)前記錄為結(jié)果集中的第一條記錄,prior命令則使指針上移至第一條記錄上方,并不會(huì)抽取結(jié)果。
--next命令用來(lái)抽取當(dāng)前記錄的后一條記錄,并定位指針。新打開(kāi)的數(shù)據(jù)庫(kù)使用next抽取出結(jié)果集中第一行記錄。如果結(jié)果集中最后一行記錄為當(dāng)前記錄,next則使指針指向最后一條記錄下方,并不會(huì)抽取出結(jié)果。
--last命令用來(lái)抽取結(jié)果集中的最后一條記錄,并定位指針。
--absolute {n|@變量},當(dāng)n(或@變量)為正數(shù)時(shí),返回結(jié)果集中從頭開(kāi)始的第n(或@變量)條記錄,并定位指針;當(dāng)n(或@變量)為負(fù)數(shù)時(shí),返回結(jié)果集中從末尾開(kāi)始的第n(或@變量)條記錄,并定位指針。
--relative {n|@變量},當(dāng)n(或@變量)為正數(shù)時(shí),返回結(jié)果集中從當(dāng)前行開(kāi)始向下的第n(或@變量)條記錄,并定位指針;當(dāng)n(或@變量)為負(fù)數(shù)時(shí),返回結(jié)果集中從末尾開(kāi)始的第n(或@變量)條記錄,并定位指針。
--可以使用全局變量@@fetch_status的值來(lái)判斷fetch命令是否抽取到數(shù)據(jù)。值為0表示抽取到記錄;值為-1表示指針指向結(jié)果集最后一條記錄下方;值為-2表示抽取操作存在問(wèn)題。
?
--關(guān)閉游標(biāo)
close 游標(biāo)名 --游標(biāo)關(guān)閉后不能使用fetch命令抽取游標(biāo)中的記錄,除非再次使用open命令(打開(kāi))重新打開(kāi)。
?
--釋放游標(biāo)
deallocate 游標(biāo)名 --被釋放后的游標(biāo)不能再使用open命令打開(kāi)使用,除非使用declare命令(聲明)重新定義。
例:(***下面是一個(gè)幫助理解的案例***)(逐條查看“商品管理數(shù)據(jù)庫(kù)”的“銷(xiāo)售信息表”中2012年12月20日的銷(xiāo)售信息)use 商品管理數(shù)據(jù)庫(kù)goset nocount on--聲明游標(biāo)declare c_銷(xiāo)售表_日期 cursorforselect 商品信息表.商品編號(hào),商品信息表.商品名稱(chēng),銷(xiāo)售金額 from 商品信息表,銷(xiāo)售信息表 where 商品信息表.商品編號(hào)=銷(xiāo)售信息表.商品編號(hào)and 銷(xiāo)售日期='2012-12-20'--打開(kāi)游標(biāo)open c_銷(xiāo)售表_日期--抽取數(shù)據(jù)beginprint '=====2012年12月20日銷(xiāo)售信息====='declare @pdno nchar(8),@pdname nvarchar(10), @salemoney decimal(17,2)--抽取第一條記錄,并將抽取到的變量賦值給相應(yīng)變量fetch next from c_銷(xiāo)售表_日期 into @pdno,@pdname,@salemoney--使用全局變量@@fetch_status值是否為0作為循環(huán)判斷條件,檢驗(yàn)是否抽取到記錄,如抽取到就在循環(huán)體內(nèi)輸出抽取到的值,--再繼續(xù)使用fetch命令抽取數(shù)據(jù),直到@@FETCH_STATUS的值不為0為止while(@@FETCH_STATUS=0)beginprint '商品編號(hào):'+@pdno+' 商品名稱(chēng):'+@pdname+' 銷(xiāo)售金額:'+convert(nchar(25),@salemoney)fetch next from c_銷(xiāo)售表_日期 into @pdno,@pdname,@salemoneyendend--關(guān)閉游標(biāo)close c_銷(xiāo)售表_日期--釋放游標(biāo)deallocate c_銷(xiāo)售表_日期set nocount offgo 理解例子??注:"--"可看成說(shuō)明或者注釋文本
轉(zhuǎn)載于:https://www.cnblogs.com/xifengyeluo/p/5898518.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server 数据库的维护(四)__游标(cursor)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么申请平安银行信用卡账单分期?三种方法
- 下一篇: 数据库 sqlite 进阶