现在的位置: 首页 > 综合 > 正文

声明游标

2013年04月01日 ⁄ 综合 ⁄ 共 3809字 ⁄ 字号 评论关闭

3.5.1  声明游标

【例3.34】  声明游标的简单例子。

     /* 下列声明的游标默认为FORWARD_ONLY游标 */

DECLARE E1cursor cursor

FOR SELECT *

          FROM c_example

      /* 下列声明的游标为STATIC游标且默认为SCROLL */

DECLARE E2cursor cursor

STATIC

FOR SELECT *

          FROM c_example

 

T-SQL,使用DECLARE CURSOR语句来声明游标。DECLARE CURSOR语句既可接受基于SQL-92标准的语法,也可接受使用T-SQL扩展的语法。

DECLARE CURSOR语句SQL-92标准语法格式:

DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR

FOR select语句

[ FOR { READ ONLY | UPDATE [ OF 列名 [,…] ] } ]

DECLARE CURSOR语句T-SQL扩展语法格式:

DECLARE 游标名CURSOR

[ LOCAL | GLOBAL ]

[ FORWARD_ONLY | SCROLL ]

[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]

[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]

[ TYPE_WARNING ]

FOR select语句

[ FOR UPDATE [ OF 列名 [,…] ] ]

DYNAMIC   指定游标为‘动态’游标。动态游标能够反映出结果集内的行所做的所有数据更改。行的数据值、顺序和成员在每次提取时都会更改。动态游标不支持 ABSOLUTE 提取选项。由于使用动态游标时记录会不断地被更新,所以用户能够立刻看到别人对记录所作的修改。这种游标是最灵活的,但同时也耗用最大的系统开销和资源。

FAST_FORWARD   指定启用性能优化的FORWARD_ONLY,READ_ONLY游标。如果指定了 FAST_FORWARD,则不能也指定SCROLL或FOR_UPDATE。 FAST_FORWARD和FORWARD_ONLY是互斥的,如果指定了其中一个,则不能指定另一个。

READ_ONLY   禁止通过该游标进行更新。在UPDATE或DELETE语句的WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。

SCROLL_LOCKS    指定确保通过游标完成的定位更新或定位删除可以成功。当将行读入游标以确保它们可用于以后的修改时, SQL Server会锁定这些行。如果指定了 FAST_FORWARD,则不能指定 SCROLL_LOCKS。

OPTIMISTIC   指定该选项的作用是: 如果行自从被读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时SQL Server锁定行,SQL Server会使用timestamp列值的比较,或者如果表中没有timestamp列则使用校验值,以确定将行读入游标后是否已修改该行。如果已修改该行,尝试进行的定位更新或定位删除将失败。如果还指定了FAST_FORWARD,则不能指定OPTIMISTIC。

TYPE_WARNING   指定该选项后,如果游标从所请求的类型隐性转换为另一种类型,则给客户端发送警告消息。

select语句   定义游标结果集的标准select语句。在游标声明的select语句内不允许使用COMPUTE,COMPUTE…BY,FOR BROWSE和INTO等关键字。如果select语句内的子句与所请求的游标类型冲突,SQL Server将游标隐性转换成另一种类型。

UPDATE [OF 列名 [,…]]   定义游标内可更新的列。如果给出了“OF 列名 [,…]”,则只允许修改列出的列。如果在UPDATE中未指定列的列表,除非也指定了READ_ONLY选项,否则所有列均可更新。

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

给游标用动态sql语句,可是游标不支持,我怎么才让他可以支持呢!!!!!!!!


问号之间是问题所在!!!


不行先定个临时表,将exec后的结果存起来,再用游标调用。


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


游标可以嵌套吗?那◎◎fetch_status 保留的是什么时候的状态呢?


游标可以嵌套,只要记得在不需要它时加上
close my_cursor1
deallocate my_cursor1
@@fetch_status 有三种状态
0 FETCH 语句成功。 
-1 FETCH 语句失败或此行不在结果集中。 
-2 被提取的行不存在。 

抱歉!评论已关闭.