DarknessHover

SQL_游标

前言

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

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

定义

游标的分类:

  1. 根据游标中的数据是否会随源数据变化分为【静态游标】和【动态游标】
  2. 根据游标是否可以回滚可以分为【只进游标】和【滚动游标】

 

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

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

他对于游标语法中的很多平时不常用的参数都做了详尽的介绍。

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

使用方法(语法)

SQL server为例进行讲解

创建/声明游标

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

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

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

打开游标

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

 1 Open [游标名称] 

关闭游标

关闭游标之后,则无法对游标进行任何操作。

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

 1 Close [游标名称] 

删除/释放游标

一旦删除游标,便无法再次打开它。

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

 1 Deallocate [游标名称] 

游标的作用

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

 

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

 

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

游标的常见用法

提取某行的数据

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

在使用游标提取数据时,往往需要提前定义大量的变量将提取的数据保存起来,以便其他的操作。用来暂存结果的变量的数量必须和游标查询的结果集的列数相同。(需要存放变量时,只需在下面的代码示例之后加into @变量名 即可)

 1 Fetch first from [游标名称] into @变量名

遍历游标

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

@@fetch_status = 0 则提取成功

@@fetch_status = -1 则提取失败

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

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

利用游标进行数据的修改

 

1 Update [需要修改的表名] set [需要修改的字段信息] where current of [游标名]

利用游标进行数据的删除

 

1 Delete from [需要修改的表名] where current of [游标名]

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

 

posted on 2021-11-29 11:36  DarknessHover  阅读(172)  评论(0编辑  收藏  举报

导航