标签归档:游标

mssql sqlserver 静态游标 动态游标 keyset驱动游标 相关知识分享


摘要:
下文分别讲述 静态游标 动态游标 keyset驱动游标 的应用场景,如下所示:
实验环境:sql server 2008 R2


当我们创建一个游标,不指定游标属性时,游标默认为一个动态游标。

动态游标:

动态游标通常和滚动游标一起使用,当数据基表中的数据变化后,动态游标可以实时获取基表中的数据变化。

静态游标:

静态游标当我们为游标进行赋值时,游标结果集被放入tempdb数据库中缓存,当基表数据发生变化时,游标中
的结果集,还是赋值游标时的值,静态游标不会反应基表中的数据变化。
由于静态游标的数据是被存储在tempdb中,所以结果集不能超过tempdb的相关限制。

keyset游标:

keyset游标:此游标中的行成员和顺序都是固定的;
keyset游标由一组标识符控制,这组标识符称之为“键集”,当打开游标时键值就被生成在tempdb数据库中

 ---申明三种游标的方法分享
DECLARE    [游标类型] CURSOR [ LOCAL | GLOBAL ] 
     [ FORWARD_ONLY | SCROLL ] 
     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]   ---指定游标为(静态游标  keyset 动态 只进游标)
     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
     [ TYPE_WARNING ] 
     FOR   [查询结果集语句] 

mssql sqlserver 只进游标和滚动游标说明


摘要:
下文讲述sqlserver中只进游标和滚动游标,如下所示:
实验环境:sql server 2008 R2


默认情况下,创建游标为只进游标。
只进游标:从第一行依次读取至最后一行,只可使用fetch next依次读取下一行,不支持跳跃读取
不支持向后读取。

只进游标的缺点:当游标读取过的数据被update 操作过,此时由于游标不支持向后读取,所以无法重新读取数据
,获取修改后的值。

 ---定义游标需使用的临时变量
     declare @a int
     declare @b varchar(60)
      
     ---定义只进游标,并将游标赋值
     declare testCursor cursor  fast_forward for 
        select a,b from test 
        order by a asc 
        for read only 
    
     --打开游标
     open  testCursor 
     ---循环游标 
     while 0=0 
     begin
      ---读取游标中的数据
      fetch next   ---读取下一行
          from testCursor
       into @a,@b 
      
       if @@fetch_status <> 0 
        begin 
           break   ---退出while 循环
        end 
         ---输出或操作变量
         print @a 
         print @b 
      end 

     close testCursor              ---关闭游标
     deallocate testCursor       ---释放游标

滚动游标:
滚动游标同只进游标最大的不同之处在于,滚动可以跳跃或指定行进行游标中数据的获取,
滚动游标支持多种fetch读取方式,如下表所示:
滚动游标:
滚动游标的创建方法,在cursor前加入”scroll”关键字即可

     ---定义滚动游标
     declare testCursor   scroll  cursor for 
        select a,b from test 
        order by a asc 
        for read only  
fetch next

读取当前行的下一行
fetch prior

读取当前行的前一行
fetch first

读取游标中的第一行
fetch last

读取游标中的最后一行
fetch absolute n(n为一个整数常量)

n=0 不返回任何行
n >0 返回从游标中第n行
n<0 返回从游标尾部开始的第n行
fetch relative n(n为一个整数常量)

n=0 不返回任何行
n >0 返回从当前行开始的第n行
n<0 返回从当前行开始的之前的第n行

 ---定义游标需使用的临时变量
     declare @a int
     declare @b varchar(60)
      
     ---定义滚动游标,并将游标赋值
     declare testCursor  scroll cursor  for 
        select a,b from test 
        order by a asc 
        for read only 
    
     --打开游标
     open  testCursor 
      
      fetch next   ---读取游标中的下一行
          from testCursor
       into @a,@b 
       ---输出变量 
         print @a 
         print @b 


      fetch last    ---读取游标中的最后一行
          from testCursor   into @a,@b 
       ---输出变量 
         print @a 
         print @b 


      fetch prior    ---读取游标当前行的前一行
          from testCursor   into @a,@b 
       ---输出变量 
         print @a 
         print @b 


    fetch absolute 2     ---读取游标中的第二行
          from testCursor   into @a,@b 
      
     
    fetch relative 2     ---读取当前行的第二行
          from testCursor   into @a,@b  



     close testCursor              ---关闭游标
     deallocate testCursor       ---释放游标

mssql sqlserver 游标创建的基础例子


摘要:
下文讲述游标创建的例子,如下所示:
实验环境:sql server 2008 R2



1.游标的应用场景

在sql脚本编写中,游标主要应用于存储过程和触发器中,创建游标的步骤如下所示:
1.申明临时变量,用于游标执行中临时存储数据
2.什么一个游标,并定义游标属性 declare cursor
3.打开一个游标,并把select结果集放入游标中
4.使用fetich into语句获取游标中的单个行,并将行中的数据放入”1 中申请的变量中”
5.游标使用完毕后,使用close关闭游标,并释放游标所占用的资源


2.游标的举例应用

    ---创建一个存储过程,依次读取一张数据表中的数据
    create proc pr_test
    as 
      ---定义游标需使用的临时变量
     declare @a int
     declare @b varchar(60)
      
     ---定义只读游标,并将游标赋值
     declare testCursor cursor for 
        select a,b from test 
        order by a asc 
        for read only 
    
     --打开游标
     open  testCursor 
     ---循环游标 
     while 0=0 
     begin
      ---读取游标中的数据
      fetch next   ---读取下一行
          from testCursor
       into @a,@b 
      
       if @@fetch_status <> 0 
        begin 
           break   ---退出while 循环
        end 
         ---输出或操作变量
         print @a 
         print @b 
      end 

     close testCursor              ---关闭游标
     deallocate testCursor       ---释放游标

在以上的语句中游标的名称被放入declare 和cursor关键字之间
for关键字后面为对游标进行赋值,在对游标进行赋值的select 语句中不能存在以下关键字

compute、compute by 、for browse 、into

fetch next 为读取行数据,第一次读取时,获取第一行数据,依次向下获取数据,
@@fetch_status 等于0代表读取成功
@@fetch_status 等于-1代表读取失败或行不在结果集中
@@fetch_status 等于-2代表读取的行不存在
游标操作完毕后,应立即关闭游标,当我们没有使用”deallocate”时,我们可以通过open再次重新读取
游标
如游标不需要使用时,可使用deallocate永久释放游标

---游标另类定义方法
   declare testCursor  cursor      ---定义游标
      set  testCursor =cursor for  ---使用set对游标进行赋值
        select a,b from test 
        order by a asc 
        for read only 
  


游标的作用域

我们可以通过在cursor关键字后使用local global关键字来指定游标的作用域
local的作用域为局部,(缺省情况下为local),对当前过程的范围有效
global作用域为全局,对当前连接都有效