zoukankan      html  css  js  c++  java
  • SQL之游标

    在性能上,游标会吃更多的内存减少可用的并发占用宽带,锁定资源,当然还有更多的代码量…… 

    T-SQL中游标的生命周期以及实现

        在T-SQL中,游标的生命周期由5部分组成

    1.定义一个游标

         在T-SQL中,定义一个游标可以是非常简单,也可以相对复杂,取决于游标的参数.而游标的参数设置取决于你对游标原理的了解程度.

         游标其实可以理解成一个定义在特定数据集上的指针,我们可以控制这个指针遍历数据集

        或者仅仅是指向特定的行,所以游标是定义 在以Select开始的数据集上的:

    --游标(用来存储多条查询数据的一种数据结构(结果集),它有一个指针,用来上往下移动,从而达到遍历每条记录的作用

    下面仔细讲一下如何定义游标:

       游标分为游标类型和游标变量

    对于游标变量来说,遵循T-SQL变量的定义方法(啥,不知道T-SQL变量定义的规则?参考我前面的博文).

    游标变量支持两种方式赋值,定义时赋值和先定义后赋值,定义游标变量像定义其他局部变量一样,在游标前加”@”,注意,如果定义全局的游标,只支持定义时直接赋值,并且不能在游标名称前面加“@”,

    定义时赋值

    declare  TestCursor  Cursor for   --Cursor(克瑟)
    select * from MvcUsers

    --先定义后赋值

    declare @TestCursors cursor
    set @TestCursors=cursor for
    select * from MvcUsers

    ====================================

    -- LOCAL意味着游标的生存周期只在批处理或函数或存储过程中可见,
    --而GLOBAL意味着游标对于特定连接作为上下文,全局内有效,例如:

    declare test_cursor cursor global for--//global 全局变量,在此处理结束后依然有效,默认是global
    select * from MvcUsers
    
    declare test_cursors cursor local for--// 局部游标,在此处理结束后,被隐式释放,无法再其他批出理中调用
    select * from MvcUsers
    
    --用go执行上面的作用域
    go
    open test_cursor//打开游标
    open test_cursors--//关闭游标 close test_cursors

    --Forward_Only 和 Scroll 二选一

    FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项
    而SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动,

    --不加参数,默认Forward_only

    ---------------------------------------------------------------------------------

    declare Test_Cursor cursor for
    select * from MvcUsers
    --//默认和forward_only选项,只支持fetch next 选项,
    --不支持游标向后或者走向特定位置
    --加forward only
    declare Test_Cursor1 cursor forward_only for
    select * from MvcUsers
    
    --加Scroll(“滚动”)
    declare Test_Cursor2 cursor scroll for--scroll支持游标向任何方向移动
    select * from MvcUsers
    
    fetch last from Test_Cursor
    fetch last from Test_Cursor1
    fetch last from Test_Cursor2

    ✪✪✪✪使用游标

    declare TestCursor cursor scroll for --必须指定Scroll,否则只支持next只进选项
    select name from MvcUsers--这里就是将name的结果集存在了TestCursor这个游标“容器”里了
    open TestCursor
    
    declare @c varchar(20)
    --读取下一行
    Fetch next from TestCursor into @c-----这里就类比一个For循环进行把TestCursor的数据集一个个取出来~
    print @c-------------------------------------
    
    --读取最后一行
    Fetch last from TestCursor into @c
    print @c
    
    --读取第一行
    Fetch first from TestCursor into @c
    print @c
    
    --读取上一行
    Fetch Prior from TestCursor into @c
    print @c
    
    --读取第3行
    Fetch absolute 3 from TestCursor into @c
    print @c
    
    --读取相对目前来说上一行
    Fetch relative -1 from TestCursor into @c
    print @c

     转自:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html

  • 相关阅读:
    0607pm克隆&引用类&加载类&面向对象串讲&函数重载
    0607am抽象类&接口&析构方法&tostring&小知识点
    静态
    面向对象--继承和多态
    面向对象的三个特性:封装
    ALV可输入状态下输入金额字段变小数的问题
    退出程序是跳过屏幕自检 比如 必输 EXIT-COMMAND
    ALV的报表对用户定义格式的控制(ALV I_SAVE)
    获利能力分析COPA的BAPI:BAPI_COPAACTUALS_POSTCOSTDATA 通过增强返回凭证号
    一个使用CDS VIEW 的 DEMO
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/7588441.html
Copyright © 2011-2022 走看看