游標(biāo)的概念
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、成都網(wǎng)站制作、黃平網(wǎng)絡(luò)推廣、成都小程序開發(fā)、黃平網(wǎng)絡(luò)營(yíng)銷、黃平企業(yè)策劃、黃平品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供黃平建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
游標(biāo)是一種數(shù)據(jù)訪問(wèn)機(jī)制,是一個(gè)在給定結(jié)果集中以行為單位訪問(wèn)和操縱數(shù)據(jù)的數(shù)據(jù)庫(kù)對(duì)象
游標(biāo)的好處:可以逐行的處理數(shù)據(jù)允許定位于結(jié)果集中的特定的行從當(dāng)前結(jié)果集中獲取一行
能對(duì)結(jié)果集的當(dāng)前行進(jìn)行修改
T-SQL中的游標(biāo)定義在MSDN中如下:
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 ] ] ] [;] --默認(rèn)作用域?yàn)镚LOBAL --默認(rèn) Forward_Only,意味著游標(biāo)只能從數(shù)據(jù)集開始向數(shù)據(jù)集結(jié)束的方向讀取,F(xiàn)ETCH NEXT是唯一的選項(xiàng),而SCROLL支持游標(biāo)在定義的數(shù)據(jù)集中向任何方向,或任何位置移動(dòng) --STATIC KEYSET DYNAMIC 和 FAST_FORWARD 四選一 這四個(gè)關(guān)鍵字是游標(biāo)所在數(shù)據(jù)集所反應(yīng)的表內(nèi)數(shù)據(jù)和游標(biāo)讀取出的數(shù)據(jù)的關(guān)系 STATIC意味著,當(dāng)游標(biāo)被建立時(shí),將會(huì)創(chuàng)建FOR后面的SELECT語(yǔ)句所包含數(shù)據(jù)集的副本存入tempdb數(shù)據(jù)庫(kù)中,任何對(duì)于底層表內(nèi)數(shù)據(jù)的更改不會(huì)影響到游標(biāo)的內(nèi)容. DYNAMIC是和STATIC完全相反的選項(xiàng),當(dāng)?shù)讓訑?shù)據(jù)庫(kù)更改時(shí),游標(biāo)的內(nèi)容也隨之得到反映,在下一次fetch中,數(shù)據(jù)內(nèi)容會(huì)隨之改變 KEYSET可以理解為介于STATIC和DYNAMIC的折中方案。將游標(biāo)所在結(jié)果集的唯一能確定每一行的主鍵存入tempdb,當(dāng)結(jié)果集中任何行改變或者刪除時(shí),@@FETCH_STATUS會(huì)為-2,KEYSET無(wú)法探測(cè)新加入的數(shù)據(jù) FAST_FORWARD可以理解成FORWARD_ONLY的優(yōu)化版本.FORWARD_ONLY執(zhí)行的是靜態(tài)計(jì)劃,而FAST_FORWARD是根據(jù)情況進(jìn)行選擇采用動(dòng)態(tài)計(jì)劃還是靜態(tài)計(jì)劃,大多數(shù)情況下FAST_FORWARD要比FORWARD_ONLY性能略好. --READ_ONLY SCROLL_LOCKS OPTIMISTIC 三選一 READ_ONLY意味著聲明的游標(biāo)只能讀取數(shù)據(jù),游標(biāo)不能做任何更新操作 SCROLL_LOCKS是另一種極端,將讀入游標(biāo)的所有數(shù)據(jù)進(jìn)行鎖定,防止其他程序進(jìn)行更改,以確保更新的絕對(duì)成功 OPTIMISTIC是相對(duì)比較好的一個(gè)選擇,OPTIMISTIC不鎖定任何數(shù)據(jù),當(dāng)需要在游標(biāo)中更新數(shù)據(jù)時(shí),如果底層表數(shù)據(jù)更新,則游標(biāo)內(nèi)數(shù)據(jù)更新不成功,如果,底層表數(shù)據(jù)未更新,則游標(biāo)內(nèi)表數(shù)據(jù)可以更新
游標(biāo)的類型
靜態(tài)游標(biāo):adopenstatic不檢測(cè)數(shù)據(jù)行的變化
動(dòng)態(tài)游標(biāo):adopendynamic反映所有數(shù)據(jù)行的改變
僅向前游標(biāo):adopenforwardonly 不支持滾動(dòng)
鍵集游標(biāo):adopenstatic能反映修改,但不能準(zhǔn)群反映插入、刪除
游標(biāo)的使用順序
定義游標(biāo)declare
打開游標(biāo)open
使用游標(biāo)fetch
關(guān)閉游標(biāo)close
釋放游標(biāo)deallocate
declare curTest cursor
scroll for select Title from dbo.Course
open curTest --打開游標(biāo)
fetch curTest
declare @Name varchar(50)
fetch first from curTest into @Name
print '課程:'+@Name
while @@FETCH_STATUS=0
begin
fetch next from curTest into @Name
print '課程:'+@Name
end
close curTest --關(guān)閉游標(biāo)
deallocate curTest --釋放游標(biāo)
如果能不用游標(biāo),盡量不要使用游標(biāo)
用完用完之后一定要關(guān)閉和釋放
盡量不要在大量數(shù)據(jù)上定義游標(biāo)
盡量不要使用游標(biāo)上更新數(shù)據(jù)
盡量不要使用insensitive, static和keyset這些參數(shù)定義游標(biāo)
如果可以,盡量使用FAST_FORWARD關(guān)鍵字定義游標(biāo)
如果只對(duì)數(shù)據(jù)進(jìn)行讀取,當(dāng)讀取時(shí)只用到FETCH NEXT選項(xiàng),則最好使用FORWARD_ONLY參數(shù)