zoukankan      html  css  js  c++  java
  • 声明游标

    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 被提取的行不存在。 

  • 相关阅读:
    git 镜像地址
    IntelliJ IDEA 2019 控制台中文乱码问题
    LINUX配置本地YUM源
    动态添加js的代码
    Java 多线程
    Java I/O系统
    Java 中的容器 Collection 和 Map
    Java 数组
    javaweb的四大作用域
    三层 转自http://git.oschina.net/tzhsweet/superui
  • 原文地址:https://www.cnblogs.com/runfeng/p/284398.html
Copyright © 2011-2022 走看看