声明游标
3.5.1? 聲明游標(biāo)
【例3.34】? 聲明游標(biāo)的簡(jiǎn)單例子。<?XML:NAMESPACE PREFIX = O />
???? /* 下列聲明的游標(biāo)默認(rèn)為FORWARD_ONLY游標(biāo) */
DECLARE E1cursor cursor
FOR SELECT *
??? ??????FROM c_example
????? /* 下列聲明的游標(biāo)為STATIC游標(biāo)且默認(rèn)為SCROLL */
DECLARE E2cursor cursor
STATIC
FOR SELECT *
??? ??????FROM c_example
?
在T-SQL,使用DECLARE CURSOR語(yǔ)句來(lái)聲明游標(biāo)。DECLARE CURSOR語(yǔ)句既可接受基于SQL-92標(biāo)準(zhǔn)的語(yǔ)法,也可接受使用T-SQL擴(kuò)展的語(yǔ)法。
DECLARE CURSOR語(yǔ)句SQL-92標(biāo)準(zhǔn)語(yǔ)法格式:
DECLARE 游標(biāo)名 [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select語(yǔ)句
[ FOR { READ ONLY | UPDATE [ OF 列名 [,…] ] } ]
DECLARE CURSOR語(yǔ)句T-SQL擴(kuò)展語(yǔ)法格式:
DECLARE 游標(biāo)名CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select語(yǔ)句
[ FOR UPDATE [ OF 列名 [,…] ] ]
DYNAMIC?? 指定游標(biāo)為‘動(dòng)態(tài)’游標(biāo)。動(dòng)態(tài)游標(biāo)能夠反映出結(jié)果集內(nèi)的行所做的所有數(shù)據(jù)更改。行的數(shù)據(jù)值、順序和成員在每次提取時(shí)都會(huì)更改。動(dòng)態(tài)游標(biāo)不支持 ABSOLUTE 提取選項(xiàng)。由于使用動(dòng)態(tài)游標(biāo)時(shí)記錄會(huì)不斷地被更新,所以用戶能夠立刻看到別人對(duì)記錄所作的修改。這種游標(biāo)是最靈活的,但同時(shí)也耗用最大的系統(tǒng)開銷和資源。
FAST_FORWARD?? 指定啟用性能優(yōu)化的FORWARD_ONLY,READ_ONLY游標(biāo)。如果指定了 FAST_FORWARD,則不能也指定SCROLL或FOR_UPDATE。 FAST_FORWARD和FORWARD_ONLY是互斥的,如果指定了其中一個(gè),則不能指定另一個(gè)。
READ_ONLY?? 禁止通過該游標(biāo)進(jìn)行更新。在UPDATE或DELETE語(yǔ)句的WHERE CURRENT OF 子句中不能引用游標(biāo)。該選項(xiàng)替代要更新的游標(biāo)的默認(rèn)功能。
SCROLL_LOCKS??? 指定確保通過游標(biāo)完成的定位更新或定位刪除可以成功。當(dāng)將行讀入游標(biāo)以確保它們可用于以后的修改時(shí), SQL Server會(huì)鎖定這些行。如果指定了 FAST_FORWARD,則不能指定 SCROLL_LOCKS。
OPTIMISTIC?? 指定該選項(xiàng)的作用是: 如果行自從被讀入游標(biāo)以來(lái)已得到更新,則通過游標(biāo)進(jìn)行的定位更新或定位刪除不成功。當(dāng)將行讀入游標(biāo)時(shí)SQL Server不鎖定行,SQL Server會(huì)使用timestamp列值的比較,或者如果表中沒有timestamp列則使用校驗(yàn)值,以確定將行讀入游標(biāo)后是否已修改該行。如果已修改該行,嘗試進(jìn)行的定位更新或定位刪除將失敗。如果還指定了FAST_FORWARD,則不能指定OPTIMISTIC。
TYPE_WARNING?? 指定該選項(xiàng)后,如果游標(biāo)從所請(qǐng)求的類型隱性轉(zhuǎn)換為另一種類型,則給客戶端發(fā)送警告消息。
select語(yǔ)句?? 定義游標(biāo)結(jié)果集的標(biāo)準(zhǔn)select語(yǔ)句。在游標(biāo)聲明的select語(yǔ)句內(nèi)不允許使用COMPUTE,COMPUTE…BY,FOR BROWSE和INTO等關(guān)鍵字。如果select語(yǔ)句內(nèi)的子句與所請(qǐng)求的游標(biāo)類型沖突,SQL Server將游標(biāo)隱性轉(zhuǎn)換成另一種類型。
UPDATE [OF 列名 [,…]]?? 定義游標(biāo)內(nèi)可更新的列。如果給出了“OF 列名 [,…]”,則只允許修改列出的列。如果在UPDATE中未指定列的列表,除非也指定了READ_ONLY選項(xiàng),否則所有列均可更新。
declare?@dbname?varchar(50)
declare?my_cursor?cursor?for
select?name?into?dbname?from?master..sysdatabases?where?name='gateloghb'--name?like?'gatelog%'
open?my_cursor?
fetch?next?from?my_cursor?into?@dbname
while?@@fetch_status?=?0?
begin?
declare?@filename?varchar(50)
exec('use?'+@dbname)
???????????????????????
declare?my_cursor1?cursor?for
exec('select?name??from?'+@dbname+'.dbo.sysobjects
where?xtype=''u''?and?name?like?''bak_mo_200%''or?name?like?''bak_mt_200%''?or?name?like?''bak_smc_200%''?or?name?like?''bak_rpt_200%''?')
?????????????????????
open?my_cursor1?
fetch?next?from?my_cursor1?into?@filename
while?@@fetch_status?=?0?
begin
if??(cast(right(@filename,6)?as?int)-200405)<=0
exec?('drop?table?gateloghb.dbo.'+@filename)
print(@filename)
fetch?next?from?my_cursor1?into?@filename
end
close?my_cursor1
deallocate?my_cursor1
fetch?next?from?my_cursor?into?@dbname
end
close?my_cursor
deallocate?my_cursor
http://www2.scut.edu.cn/achievement/15/kj/database/zbb/db3_5_1.htm
給游標(biāo)用動(dòng)態(tài)sql語(yǔ)句,可是游標(biāo)不支持,我怎么才讓他可以支持呢!!!!!!!!
問號(hào)之間是問題所在!!!
不行先定個(gè)臨時(shí)表,將exec后的結(jié)果存起來(lái),再用游標(biāo)調(diào)用。
declare?@dbname?varchar(50)
declare?@s_sql?varchar(500)
declare?my_cursor?cursor?for
??select?name?
??from?master..sysdatabases?
??where?name='gateloghb'--name?like?'gatelog%'
open?my_cursor?
fetch?next?from?my_cursor?into?@dbname
while?@@fetch_status?=?0?
??begin?
????declare?@filename?varchar(50)
????exec('use?'+@dbname)
????set?@s_sql?=?'declare?my_cursor1?cursor?for
????????????????????select?name??from?'?+?@dbname?+?'.dbo.sysobjects
????????????????????where?xtype=''u''?and?name?like?''bak_mo_200%''or?name?like?''bak_mt_200%''?or?name?like?''bak_smc_200%''?or?name?like?''bak_rpt_200%''?'
????exec(@s_sql)
????open?my_cursor1?
????fetch?next?from?my_cursor1?into?@filename
????while?@@fetch_status?=?0?
??????begin
????????if(cast(right(@filename,6)?as?int)-200405)<=0
??????????exec?('drop?table?gateloghb.dbo.'+@filename)
????????print(@filename)
????????fetch?next?from?my_cursor1?into?@filename
??????end
????close?my_cursor1
????deallocate?my_cursor1
??fetch?next?from?my_cursor?into?@dbname
end
close?my_cursor
deallocate?my_cursor
游標(biāo)可以嵌套嗎?那◎◎fetch_status?保留的是什么時(shí)候的狀態(tài)呢?
游標(biāo)可以嵌套,只要記得在不需要它時(shí)加上
close?my_cursor1
deallocate?my_cursor1
@@fetch_status?有三種狀態(tài)
0?FETCH?語(yǔ)句成功。?
-1?FETCH?語(yǔ)句失敗或此行不在結(jié)果集中。?
-2?被提取的行不存在。?
總結(jié)
- 上一篇: 寂寞的hasLayout
- 下一篇: linux下mysql远程登陆