SQL_游标
前言
我自己查询“游标”相关的概念时,大部分文章上来就直接堆砌概念;对我这种使用经验少,SQL底子差的人实在是太不友好了。于是我尝试自己将语法验证一遍之后再进行加工整理,力求通俗易懂。
友情提示:在了解“游标”之前,建议先了解“存储过程”的相关概念及用法,在本片文章中我将默认读者已经拥有了前置知识,不再做冗余介绍。
定义
游标的分类:
- 静态游标
- 动态游标
- 键集游标
本文对游标的分类只做简单介绍,对于初学者可以暂时不管这些。在了解了游标的常见用法后,返回头再查询游标的分类便可一目了然。
对其他类型游标的声明格式和方法感兴趣的可以参考博客园博主【张龙豪】的文章
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关键字配合from和where进行条件筛选,大部分也能实现,那游标的意义何在呢?”
如果你查询过【游标】的定义,肯定对“结果集”这个名称不陌生。几乎所有的文章在开篇时都会说——“游标就是查询得到的结果集”。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 [游标名]
在写到这里时,大家可以对比思考一下使用游标进行删除/修改操作,和使用update、delete关键字直接操作数据表——两种方式,都需要指定表名,但使用游标操作时,无需额外指定要操作的行。因为游标本身就拥有定位功能,无需额外通过条件判断要操作的行。