浅谈SQL游标

浅谈SQL游标
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。游标允许你选择一组数据,通过翻阅这组数据记录——通常被称为数据集,检查每一个游标所在的特定的行。你可以将游标和局部变量组合在一起对每一个记录进行检查,当游标移动到下一个记录时,来执行一些外部操作。游标的另一个常见的用法是:保存查询结果以备以后使用。一个游标结果集是通过执

大家好,又见面了,我是你们的朋友全栈君。

游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。游标允许你选择一组数据,通过翻阅这组数据记录——通常被称为数据集,检查每一个游标所在的特定的行。你可以将游标和局部变量组合在一起对每一个记录进行检查,当游标移动到下一个记录时,来执行一些外部操作。 游标的另一个常见的用法是:保存查询结果以备以后使用。一个游标结果集是通过执行SELECT 查询来建立的。如果你的应用程序或过程需要重复使用一组记录,那么第一次建立游标以后再重复使用,将会比多次执行查询快得多。而且,你还能在查询的结果集中翻阅记录。

 

游标的分类

游标共有3类:API服务器游标、Transaction-SQL游标和API客户端游标。其中前两种游标都是运行在服务器上的,所以又叫做服务器游标。

API服务器游标

API服务器游标主要应用在服务上,当客户端的应用程序调用API游标函数时,服务器会对API函数进行处理。使用API函数和方法可以实现如下功能:

(1)打开一个连接。

(2)设置定义游标特征的特性或属性,API自动将游标影射到每个结果集。

(3)执行一个或多个Transaction-SQL语句。

(4)使用API函数或方法提取结果集中的行。

API服务器游标包含以下四种:静态游标、动态游标、只进游标、键集驱动游标(Primary key

静态游标的完整结果集将打开游标时建立的结果集存储在临时表中,(静态游标始终是只读的)。静态游标具有以下特点:总是按照打开游标时的原样显示结果集;不反映数据库中作的任何修改,也不反映对结果集行的列值所作的更改;不显示打开游标后在数据库中新插入的行;组成结果集的行被其他用户更新,新的数据值不会显示在静态游标中;但是静态游标会显示打开游标以后从数据库中删除的行。

动态游标与静态游标相反,当滚动游标时动态游标反映结果集中的所有更改。结果集中的行数据值、顺序和成员每次提取时都会改变。

只进游标不支持滚动,它只支持游标从头到尾顺序提取数据行。注意:只进游标也反映对结果集所做的所有更改。

键集驱动游标同时具有静态游标和动态游标的特点。当打开游标时,该游标中的成员以及行的顺序是固定的,键集在游标打开时也会存储到临时工作表中,对非键集列的数据值的更改在用户游标滚动的时候可以看见,在游标打开以后对数据库中插入的行是不可见的,除非关闭重新打开游标。

Transaction-SQL游标

该游标是基于Declare Cursor 语法,主要用于Transaction-SQL脚本、存储过程以及触发器中。Transaction-SQL游标在服务器处理由客户端发送到服务器的Transaction-SQL语句。

在存储过程或触发器中使用Transaction-SQL游标的过程为:

(1)声明Transaction-SQL变量包含游标返回的数据。为每个结果集列声明一个变量。声明足够大的变量来保存列返回的值,并声明变量的类型为可从数据类型隐式转换得到的数据类型。

 

(2)使用Declare Cursor语句将Transaction-SQL游标与Select语句相关联。还可以利用Declare Cursor定义游标的只读、只进等特性。 

(3)使用Open语句执行Select语句填充游标。

(4)使用Fetch Into语句提取单个行,并将每列中得数据移至指定的变量中。注意:其他Transaction-SQL语句可以引用那些变量来访问提取的数据值。Transaction-SQL游标不支持提取行块。

(5)使用Close语句结束游标的使用。注意:关闭游标以后,该游标还是存在,可以使用Open命令打开继续使用,只有调用Deallocate语句才会完全释放。

客户端游标

该游标将使用默认结果集把整个结果集高速缓存在客户端上,所有的游标操作都在客户端的高速缓存中进行。注意:客户端游标只支持只进和静态游标。不支持其他游标。

 

游标的五要素

游标的五个要素:声明游标、打开游标、读取游标数据、关闭游标、释放游标。

声明游标是为游标指定获取数据时所使用的Select语句,声明游标并不会检索任何数据,它只是为游标指明了相应的Select 语句。

 

Transcat-SQL创建游标语法如下:

declare 游标名称 cursor 参数

for SQL语句

 [for {read only | update [of column_name_list]}]

 

声明游标的参数

(1)LocalGlobal:Local表示游标的作用于仅仅限于其所在的存储过程、触发器以及批处理中、执行完毕以后游标自动释放。Global表示的是该游标作用域是整个会话层。由连接执行的任何存储过程、批处理等都可以引用该游标名称,仅在断开连接时隐性释放。

(2)Forward_onlyScroll:前者表示为只进游标,后者表示为可以随意定位。默认为前者。

(3)StaticKeysetDynamic: 第一个表示定义一个游标,其数据存放到一个临时表内,对游标的所有请求都从临时表中应答,因此,对该游标进行提取操作时返回的数据不反映对基表所作的修改,并且该游标不允许修改。Keyset表示的是,当游标打开时,键集驱动游标中行的身份与顺序是固定的,并把其放到临时表中。Dynamic表示的是滚动游标时,动态游标反映对结果集内所有数据的更改。

(4)Read_only Scroll_LocksOptimistic:第一个表示的是只读游标,第二个表示的是在使用的游标结果集数据上放置锁,当行读取到游标中然后对它们进行修改时,数据库将锁定这些行,以保证数据的一致性。Optimistic的含义是游标将数据读取以后,如果这些数据被更新了,则通过游标定位进行的更新与删除操作将不会成功。

      标准游标:

            Declare MyCursor Cursor

                   For Select * From Master_Goods

      只读游标

            Declare MyCusror Cursor

                  For Select * From Master_Goods

                  For Read Only

    可更新游标

            Declare MyCusror Cursor

                  For Select * From Master_Goods

                  For UpDate

    打开游标使用Open语句用于打开Transaction-SQL服务器游标,执行Open语句的过程中就是按照Select语句进行填充数据,打开游标以后游标位置在第一行。

    打开游标

            全局游标:Open Global MyCursor            局部游标: Open MyCursor

    读取游标数据:在打开游标以后,使用Fetch语句从Transaction-SQL服务器游标中检索特定的一行。使用Fetch操作,可以使游标移动到下一个记录,并将游标返回的每个列得数据分别赋值给声明的本地变量。

            Fetch [Next | Prior | First | Last | Absolute n | Relative n ]  From MyCursor

            Into @GoodsID,@GoodsName

    其中:Next表示返回结果集中当前行的下一行记录,如果第一次读取则返回第一行。默认的读取选项为Next

              Prior表示返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。

              First表示返回结果集中的第一行,并且将其作为当前行。

              Last表示返回结果集中的最后一行,并且将其作为当前行。

              Absolute n 如果n为正数,则返回从游标头开始的第n行,并且返回行变成新的当前行。如果n为负,则返回从游标末尾开始的第n行,并且返回行为新的当前行,如果n0,则返回当前行。

              Relative n 如果n为正数,则返回从当前行开始的第n行,如果n为负,则返回从当前行之前的第n行,如果为0,则返回当前行。

    关闭游标调用的是Close语句,方式如下:Close Global MyCursor    Close MyCursor

释放游标调用的是Deallocate语句,方法如下:Deallocate Glboal MyCursor       Deallocate MyCursor

笔者后记:虽然游标在数据集操作方面具有一定的优势,但游标切忌不可滥用。曾经业界人士对游标给出这样的评价“游标可谓是SQL Server心中的痛: 老牛般的速度(CPU),河马般的胃口(内存)”,因此,笔记对游标的评价是“除非迫不得已,否则不要用游标!”

 

本文来自CSDN博客,转载自:http://blog.csdn.net/jerryjbiao/archive/2010/03/25/5416642.aspx

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158240.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Bootstrap系列之-FileInput中文API整理[通俗易懂]

    Bootstrap系列之-FileInput中文API整理[通俗易懂]一、引入文件<linkhref=”../css/bootstrap.min.css”rel=”stylesheet”><linkhref=”../css/fileinput.css”media=”all”rel=”stylesheet”type=”text/css”/><scriptsrc=”../js/jquery-2.0.3.min….

  • SIGPIPE信号问题

    SIGPIPE信号问题
    socket编程问题
    SIGPIPE信号问题=========================
    当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。
       根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client会退出。若不想客户端退出可以把SIGP

  • 世纪之战:Python和Java,到底学哪个更好?

    世纪之战:Python和Java,到底学哪个更好?零基础自学java,点击了解:https://how2j.cn本文章转载自(如有侵权联系我删除):微信公众号Java技术栈有人曾经将编程比作做菜,那编程语言就是首先要准备的食材或厨具。尽管在刚开始开发AI时,有很多编程语言都可以满足你的需求,但没有一种编程语言是可以一站式解决AI编程的问题,因为在每一个项目中,不同的目标需要特定的方法。和做菜时的精挑细选一样,在成为一个「高手」…

  • push master was rejected by remote(airpush)

    idea中,发布项目到OSChina的Git中,当时按照这样的流程添加Git,然后push,提示:pushtoorigin/masterwarrejected”。大概原因是:初始化项目时,远程仓库我建了README.md文件,而本地仓库与远程仓库尚未进行文件关联,因此需要将两个仓库的文件进行关联后提交。解决方案如下:1.切换到自己项目所在的目录,右键选择GITB…

  • pycharm上传代码到gitlab_pycharm配置git

    pycharm上传代码到gitlab_pycharm配置git让git忽略掉一些文件(.gitignore)#pycharm.idea/.DS_Store__pycache__/*.py[cod]*$py.class#Djangostuff:local_settings.py*.sqlite3#databasemigrations*/migrations/*.py!*/migrations/__init__.pygit管理项目

  • 卸载奇安信天擎,流氓软件怎么卸载_奇安信和360天擎

    卸载奇安信天擎,流氓软件怎么卸载_奇安信和360天擎奇安信天擎,很多朋友应该都不陌生,现在很多公司都要求每个员工的电脑上必须安装奇安信天擎这个软件,尤其是稍微大一点的公司,数据需要保密或容易被攻击的公司,奇安信可以有效的防御这些攻击。看到这是不是有朋友在想这不是一个很好的防御软件吗,为什么说是流氓软件呢?这个软件之所以叫它流氓软件,是因为这个软件一旦安装,既无法退出也无法卸载,有些朋友现在会想,这个软件就放那放着就好了啊,反正是防御的软件,我只能说你还没有了解奇安信的缺点。奇安信与一切杀毒软件冲突,公司要求安装奇安信,你就要把电脑之前的杀毒软件卸载,这

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号