SQL_游标


前言

我自己查询“游标”相关的概念时,大部分文章上来就直接堆砌概念;对我这种使用经验少,SQL底子差的人实在是太不友好了。于是我尝试自己将语法验证一遍之后再进行加工整理,力求通俗易懂。

友情提示:在了解“游标”之前,建议先了解“存储过程”的相关概念及用法,在本片文章中我将默认读者已经拥有了前置知识,不再做冗余介绍。

定义

游标的分类:

  1. 静态游标
  2. 动态游标
  3. 键集游标

 

本文对游标的分类只做简单介绍,对于初学者可以暂时不管这些。在了解了游标的常见用法后,返回头再查询游标的分类便可一目了然。

对其他类型游标的声明格式和方法感兴趣的可以参考博客园博主【张龙豪】的文章

https://www.cnblogs.com/knowledgesea/p/3699851.html

使用方法(语法)

SQL server为例进行讲解

创建/声明游标

声明游标之后,可以根据需要重复的打开和关闭游标。

本文中以滚动游标为例进行讲解,了解这个之后。其他种类游标的声明格式和语法很容易就可以触类旁通。

1 Declare 游标名称 cursor scroll                 --创建滚动游标
2 FOR select [字段名] from [表名]   --在for关键字后面跟上select语句

打开游标

游标在创建之后,只有打开才可以使用。

 1 Open [游标名称] 

关闭游标

关闭游标之后,则无法操作该游标。

如果需要使用被关闭的游标,则只需通过open”关键字将它重新打开即可。

 1 Close [游标名称] 

删除/释放游标

一旦删除游标,便无法重新打开它。

如果想使用,就只能创建游标了。

 1 Deallocate [游标名称] 

游标的作用

在看到这里时,不知道大家会不会产生这样的困惑——“游标能返回的查询信息,我通过select关键字配合fromwhere进行条件筛选,大部分也能实现,那游标的意义何在呢?”

如果你查询过【游标】的定义,肯定对“结果集”这个名称不陌生。几乎所有的文章在开篇时都会说——“游标就是查询得到的结果集”。Select得到数据的集合之后,如果我想对其中指定的行,进行精细的操作,那就只能通过游标实现了。

通过游标,还能将查询得到的结果集进行保存,不必反复进行查询,大大便利了操作。

游标的常见用法

提取某行的数据

 1 Fetch first from [游标名称] --提取游标的第一行数据
 2 
 3 Fetch last from [游标名称] --提取游标的最后一行数据
 4 
 5 Fetch absolute 2 from [游标名称] --提取第二行数据(绝对值)
 6 
 7 Fetch relative 2 from [游标名称] --提取从当前所在位置向下移动两行的数据(相对值)
 8 
 9 Fetch next from [游标名称] --提取从当前位置下移一行的数据
10 
11 Fetch prior from [游标名称] --提取从当前位置上移一行的数据

遍历游标

SQL server 提供了 @@fetch_status 这个系统变量来帮助判断游标是否提取成功

@@fetch_status = 0 则提取成功

@@fetch_status = -1 则提取失败

@@fetch_status = -2 则表示不存在

 1 Declare @variate vaarchar(30)  --定义一个变量用来存放游标中所提取的数据
 2 
 3 Fetch absolute 1 from [游标名称] into @variate     --从头开始提取游标
 4 
 5 While @@fetch_status = 0
 6 
 7 Begin
 8 
 9 Print ‘提取的内容:’+@variate     --打印提取的内容
10 
11 Fetch next from [游标名称] into @variate --将游标下移,并将读入的内容保存在变量中
12 
13 End

利用游标进行数据的修改

1 Fetch absolute 1 from 游标名称
2 
3 Update [需要修改的表名] set [需要修改的字段信息] where current of [游标名]

利用游标进行数据的删除

1 Fetch absolute 1 from 游标名称
2 
3 Delete from [需要修改的表名] where current of [游标名]

在写到这里时,大家可以对比思考一下使用游标进行删除/修改操作,和使用updatedelete关键字直接操作数据表——两种方式,都需要指定表名,但使用游标操作时,无需额外指定要操作的行。因为游标本身就拥有定位功能,无需额外通过条件判断要操作的行。