游标概念:

SQL的游标是一种临时的数据库对象,既可以存放储存在数据库表中数据行的副本,也可以指向储存在数据库中的数据行的指针,游标提供了在逐行的基础上操作表中数据的方法。

游标的作用:

1.定位到结果集中的某一行;

2.对当前位置的数据进行读写;

3.保存查询结果,以便下次有需要查询时使用,游标的结果集是有select 语句产生,如果处理过程中需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快得多。

游标的生命五大周期-:

1.声明游标

declare People_cursor  cursor  local --局部 ,global 全局游标 

for 
--查询  T-SQL
SELECT  PepoleID, DepartmentId, PepoleName ,PepoleAddress from dbo.People
where PepoleID >10

2.打开游标

open People_cursor

3.提取数据  

    fetch next from @varpepole into  @PepoleID  ,@DepartmentId  , @PepoleName ,@PepoleAddress --into 赋值
     while @@FETCH_STATUS = 0 --等于 0 或者等于 1 判断是否成功
begin 
     print cast(@PepoleID as varchar) + ','+ convert(varchar,@DepartmentId)+@PepoleName+','+@PepoleAddress;

   fetch next from  @varpepole into  @PepoleID  ,@DepartmentId  , @PepoleName ,@PepoleAddress 
    end

4.关闭游标

close  People_cursor (游标名称)

5.释放游标

deallocate People_cursor(游标名称)

只进游标:

特点: 只进游标不支持滚动,支持从头到尾提取数据,数据库执行增删改,在提取时是可见的,但由于该游标只能进不能向后滚动,所以在行提取后对行做增删改是不可见的

案例:

fetch next from @varpepole into  @PepoleID  ,@DepartmentId  , @PepoleName ,@PepoleAddress --into 赋值   (提取数据 fetch 语法)
while @@FETCH_STATUS = 0 --等于 0 或者等于 1 判断是否成功
begin 
     print cast(@PepoleID as varchar) + ','+ convert(varchar,@DepartmentId)+@PepoleName+','+@PepoleAddress;
   if @PepoleID  = 10
          update dbo.People set PepolePhone = 11111 where PepoleID  = 12
      if @PepoleID  = 12
          update dbo.People set PepolePhone = 222222 where PepoleID  = 10 
     fetch next from  @varpepole into  @PepoleID  ,@DepartmentId  , @PepoleName ,@PepoleAddress 
    end

 

 从两个 if 语句可以看到 受影响的列为 提取时,提取后的结果是看不见的,为什么我的查询结果都没有看见 没因为 我没有把  PepolePhone 设置为获取游标值,如果设置了就可以明显看到数据更新显示上的差异

总结:

  • Local:作用域为局部,只在定义它的批处理,存储过程或触发器中有效。
  • Global:作用域为全局,由连接执行的任何存储过程或批处理中,都可以引用该游标。
  • @@FETCH_STATUS: 返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。

@@FETCH_STATUS = 0 /1/2

0 FETCH 语句成功。
-1 FETCH 语句失败或此行不在结果集中。
-2 被提取的行不存在

本文部分存在转载,主要目的:解决学术问题,为学习用户提供更为精准,便于理解的概念与方法,如果有侵权,请联系删除 

更多推荐

SQL server 游标(只进游标)讲解