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       ---释放游标