• SQL Server 数据库的维护(四)__游标(cursor)


    --维护数据库--



    --游标(cursor)--

    --概述

    注:使用select语句查询结果的结果集是一个整体,如果想每次处理一行或一部分行数据,游标可以提供这种处理机制。可以将游标理解为指针指针指向哪条记录,哪条记录即是被操作记录

    游标处理结果集的方式:

    1)允许定位在结果集的指定位置行

    2)从结果集的当前位置检索一行或一部分行记录

    3)支持对结果集当前位置做数据修改、删除等操作

    --使用游标

    注:使用游标定位和操作数据记录的一般步骤为:声明游标、打开游标、抽取数据、关闭游标和释放游标

    --声明游标 (declare … cursor)

    注:声明游标跟声明变量相似,用declare命令

    declare 游标名 cursor --declare表示声明游标名,cursor表示游标含义

    [forward_only] [scroll] [read_only] [dynamic] --可选项forward_only表示游标为只进游标。可选项read_only定义游标为只读游标。可选项scroll表示可以使用所有抽取数据的选项。可选项dynamic表示游标结果集中的数据可以修改。

    for select语句 [for update [of 字段名 [ , ...] ] ] --select语句指能够查询到结果集的查询语句,其中不能包含compute、compute by和into语句。要对结果集中做update修改操作时,可以使用of字段名来指明允许被修改的字段名,如果不使用of指定字段名,则所有字段都修改。

    --打开游标

    open 游标名 --open命令表示打开。“游标名”必须是已定义的、且没有在使用的游标。刚打开游标,指针指向结果集中第一条记录之前。

    全局标量@@error可以判断游标是否打开成功,如果返回0只则说明成功,否则失败。

    全局变量@@cursor_rows可以返回被打开的游标中记录个数。

    --抽取游标

    fetch [first | prior | next | last | absolute {n|@变量} | relative {n|@变量} ] --fetch命令表示抽取数据,一次只能抽取一条记录

    [from] 游标名 [into @变量名 [, ...] ] --into@变量名,...把抽取出的字段值赋值给指定变量,然后使用。

    --first命令用来抽取结果集中的第一条记录,并定位指针。

    --prior命令用来抽取当前记录的前一条记录,并定位指针。如果当前记录为结果集中的第一条记录,prior命令则使指针上移至第一条记录上方,并不会抽取结果。

    --next命令用来抽取当前记录的后一条记录,并定位指针。新打开的数据库使用next抽取出结果集中第一行记录。如果结果集中最后一行记录为当前记录,next则使指针指向最后一条记录下方,并不会抽取出结果。

    --last命令用来抽取结果集中的最后一条记录,并定位指针。

    --absolute {n|@变量},当n(或@变量)为正数时,返回结果集中从头开始的第n(或@变量)条记录,并定位指针当n(或@变量)为负数时,返回结果集中从末尾开始的第n(或@变量)条记录,并定位指针。

    --relative {n|@变量},当n(或@变量)为正数时,返回结果集中从当前行开始向下的第n(或@变量)条记录,并定位指针;当n(或@变量)为负数时,返回结果集中从末尾开始的第n(或@变量)条记录,并定位指针。

    --可以使用全局变量@@fetch_status的值来判断fetch命令是否抽取到数据值为0表示抽取到记录值为-1表示指针指向结果集最后一条记录下方值为-2表示抽取操作存在问题

    --关闭游标

    close 游标名 --游标关闭后不能使用fetch命令抽取游标中的记录,除非再次使用open命令(打开)重新打开。

    --释放游标

    deallocate 游标名 --被释放后的游标不能再使用open命令打开使用,除非使用declare命令(声明)重新定义。

    例:(***下面是一个帮助理解的案例***)(逐条查看“商品管理数据库”的“销售信息表”中2012年12月20日的销售信息)
    
    use 商品管理数据库
    
    go
    
    set nocount on
    
    --声明游标
    
    declare c_销售表_日期 cursor
    
    for
    
    select 商品信息表.商品编号,商品信息表.商品名称,销售金额 from 商品信息表,销售信息表 where 商品信息表.商品编号=销售信息表.商品编号
    
    and 销售日期='2012-12-20'
    
    --打开游标
    
    open c_销售表_日期
    
    --抽取数据
    
    begin
    
    print '=====2012年12月20日销售信息====='
    
    declare @pdno nchar(8),@pdname nvarchar(10), @salemoney decimal(17,2)
    
    --抽取第一条记录,并将抽取到的变量赋值给相应变量
    
    fetch next from c_销售表_日期 into @pdno,@pdname,@salemoney
    
    --使用全局变量@@fetch_status值是否为0作为循环判断条件,检验是否抽取到记录,如抽取到就在循环体内输出抽取到的值,
    
    --再继续使用fetch命令抽取数据,直到@@FETCH_STATUS的值不为0为止
    
    while(@@FETCH_STATUS=0)
    
    begin
    
    print '商品编号:'+@pdno+' 商品名称:'+@pdname+' 销售金额:'+convert(nchar(25),@salemoney)
    
    fetch next from c_销售表_日期 into @pdno,@pdname,@salemoney
    
    end
    
    end
    
    --关闭游标
    
    close c_销售表_日期
    
    --释放游标
    
    deallocate c_销售表_日期
    
    set nocount off
    
    go
    理解例子 

     注:"--"可看成说明或者注释文本

  • 相关阅读:
    用spring boot 来创建第一个application
    Entily实体类
    ORM
    lambda expression
    Domain logic approochs
    mysql的数据类型(Data type)
    Backup &recovery备份和还原
    spring AOP Capability and goals
    CDI Features
    Tomcat的配置与安装
  • 原文地址:https://www.cnblogs.com/xifengyeluo/p/5898518.html
Copyright © 2020-2023  润新知