用SQL游標(biāo)對(duì)數(shù)據(jù)進(jìn)行遍歷循環(huán)
SQL游標(biāo)相信大家都比較熟悉了,下面就教您如何使用SQL游標(biāo)對(duì)數(shù)據(jù)進(jìn)行遍歷循環(huán)的方法,希望對(duì)您學(xué)習(xí)SQL游標(biāo)方面能有所幫助。
SQL游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。游標(biāo)總是與一條T_SQL 選擇語(yǔ)句相關(guān)聯(lián)因?yàn)橛螛?biāo)由結(jié)果集(可以是零條、一條或由相關(guān)的選擇語(yǔ)句檢索出的多條記錄)和結(jié)果集中指向特定記錄的游標(biāo)位置組成。當(dāng)決定對(duì)結(jié)果集進(jìn)行處理時(shí),必須聲明一個(gè)指向該結(jié)果集的游標(biāo)。
SQL游標(biāo)的優(yōu)點(diǎn)是可以方便從一個(gè)結(jié)果集中進(jìn)行循環(huán)遍歷數(shù)據(jù)在進(jìn)行操作。
1、SQL游標(biāo)允許應(yīng)用程序?qū)Σ樵冋Z(yǔ)句select 返回的行結(jié)果集中每一行進(jìn)行相同或不同的操作,而不是一次對(duì)整個(gè)結(jié)果集進(jìn)行同一種操作;
2、它還提供對(duì)基于游標(biāo)位置而對(duì)表中數(shù)據(jù)進(jìn)行刪除或更新的能力;
3、游標(biāo)把作為面向集合的數(shù)據(jù)庫(kù)管理系統(tǒng)和面向行的程序設(shè)計(jì)兩者聯(lián)系起來(lái),使兩個(gè)數(shù)據(jù)處理方式能夠進(jìn)行溝通。
然爾游標(biāo)也有缺點(diǎn)——復(fù)雜和低效,是游標(biāo)的***缺點(diǎn),也是致使很多時(shí)候在使用存儲(chǔ)過(guò)程中沒(méi)有想到游標(biāo)的主要原因。
下面是在實(shí)際工作中的一個(gè)游標(biāo)實(shí)例的應(yīng)用,通過(guò)游標(biāo)把A表的數(shù)據(jù)的一列值復(fù)制到B表的列當(dāng)中,其中二個(gè)表都有相同的UID字段,條件是對(duì)相同UID的數(shù)據(jù)進(jìn)行復(fù)制.
- declare @level varchar(100)
- declare @uid varchar(100)
- declare cur cursor--定義一個(gè)游標(biāo)
- read_only
- for select egg_code.user_id,egg_prize_level
- from egg_code inner join egg_prize on egg_prize.user_id=egg_code.user_id--為所獲得的數(shù)據(jù)集指定游標(biāo)
- open cur--打開(kāi)游標(biāo)
- fetch next from cur into @uid,@level--把提取操作的列數(shù)據(jù)放到局部變量中
- while(@@fetch_status=0)--返回被 FETCH 語(yǔ)句執(zhí)行的***游標(biāo)的狀態(tài),而不是任何當(dāng)前被連接打開(kāi)的游標(biāo)的狀態(tài)。
- begin
- --print '等級(jí):'+@level+'--------------用戶ID:'+@uid
- update egg_code set prize_level=@level where user_id=@uid--執(zhí)行操作
- --提前下一位信息
- fetch next from cur into @uid,@level
- end
- close cur--關(guān)閉游標(biāo)
- deallocate cur--刪除游標(biāo)
- go
使用游標(biāo)的順序: 聲名游標(biāo)、打開(kāi)游標(biāo)、讀取數(shù)據(jù)、關(guān)閉游標(biāo)、刪除游標(biāo)。
由于 @@FETCH_STATUS 對(duì)于在一個(gè)連接上的所有游標(biāo)是全局性的,要小心使用 @@FETCH_STATUS 。在執(zhí)行一條 FETCH 語(yǔ)句后,必須在對(duì)另一游標(biāo)執(zhí)行另一 FETCH 語(yǔ)句前測(cè)試 @@FETCH_STATUS 。在任何提取操作出現(xiàn)在此連接上前,@@FETCH_STATUS 的值沒(méi)有定義。
例如,用戶從一個(gè)游標(biāo)執(zhí)行一條 FETCH 語(yǔ)句,然后調(diào)用一個(gè)存儲(chǔ)過(guò)程,此存儲(chǔ)過(guò)程打開(kāi)并處理另一個(gè)游標(biāo)的結(jié)果。當(dāng)控制從被調(diào)用的存儲(chǔ)過(guò)程返回后,@@FETCH_STATUS 反映的是在存儲(chǔ)過(guò)程中執(zhí)行的***的 FETCH 語(yǔ)句的結(jié)果,而不是在存儲(chǔ)過(guò)程被調(diào)用之前的 FETCH 語(yǔ)句的結(jié)果。
使用上面的游標(biāo)是泉州SEO在一次網(wǎng)站砸金蛋活動(dòng)中,二個(gè)表的數(shù)據(jù)在使用的過(guò)程中有部份后期改到程序致使有部份數(shù)據(jù)無(wú)法同步,導(dǎo)致前臺(tái)查詢的時(shí)候所用到的表無(wú)法查到相關(guān)的數(shù)據(jù),沒(méi)用游標(biāo)進(jìn)行操作之前試過(guò)只用簡(jiǎn)單的SQL語(yǔ)句去實(shí)現(xiàn)這樣的同步功能,但是始終無(wú)法實(shí)現(xiàn),所以只能使用游標(biāo)來(lái)實(shí)現(xiàn)
【編輯推薦】