数据库SQL ServerSQL Server教程:详细学习游标

游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

  1.游标的组成

  游标包含两个部分:一个是游标结果集、一个是游标置。

  游标结果集:定义该游标得SELECT语句返回的行的集合。游标位置:指向这个结果集某一行的当前指针。

  2.游标的分类

  游标共有3类:

  API服务器游标

  Transaction-SQL游标

  API客户端游标

  其中前两种游标都是运行在服务器上的,所以又叫做服务器游标

  API服务器游标

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

  打开一个连接。

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

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

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

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

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

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

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

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

  Transaction-SQL游标

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

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

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

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

  使用Open语句执行Select语句填充游标

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

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

  客户端游标

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

  3.游标的生命周期

  游标的生命周期包含有五个阶段:声明游标、打开游标、读取游标数据、关闭游标、释放游标

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

  Declare 游标名称 Cursor 参数

  声明游标的参数

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

  Forward_only与Scroll:前者表示为只进游标,后者表示为可以随意定位。默认为前者。

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

  Read_only 、Scroll_Locks与Optimistic:第一个表示的是只读游标,第二个表示的是在使用的游标结果集数据上放置锁,当行读取到游标然后对它们进行修改时,数据库将锁定这些行,以保证数据的一致性。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行,并且返回行为新的当前行,如果n为0,则返回当前行。

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

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

 


 Close Global MyCursor Close MyCursor

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


  Deallocate Glboal MyCursor Deallocate MyCursor

  游标实例:


  Declare MyCusror Cursor Scroll
  For Select * From Master_Goods Order By GoodsID
  Open MyCursor
  Fetch next From MyCursor
  Into @GoodsCode,@GoodsName
  While(@@Fetch_Status = 0)
  Begin
  Begin
  Select @GoodsCode = Convert(Char(20),@GoodsCode)
  Select @GoodsName = Convert(Char(20),@GoodsName)
  PRINT @GoodsCode + ':' + @GoodsName
  End
  Fetch next From MyCursor
  Into @GoodsCode,@GoodsName
  End
  Close MyCursor
  Deallocate MyCursor

  修改当前游标的数据方法如下:


  UpDate Master_Goods Set GoodsName = 'yangyang8848' Where Current Of MyCursor;

  删除当前游标行数据的方法如下:


  Delete From Master_Goods Where Current Of MyCursor

  Select @@CURSOR_ROWS 可以得到当前游标中存在的数据行数。注意:此变量为一个连接上的全局变量,因此只对应最后一次打开的游标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编码能力被公司破制度给限制了

大家好,我是写代码的篮球今天跟很久前一个同事聊了会天,他和我一样做嵌入式软件开发,聊天中没有什么寒暄和吐槽,或许就是简简单单的知晓了双方的近况便早早结束了。当同事之间没有了太多的交际也就没有那么的话题了吧。不过那时候…

Django (八) 中间件验证码富文本缓存

中间件&验证码&富文本&缓存 1. 中间件&AOP 中间件:是一个轻量级的,底层的插件,可以介入Django的请求和响应过程(面向切面编程) ​ 中间件的本质就是一个python类 ​ 面向切面编程(Aspect O…

定位到元素后获取其属性_Selenium界面自动化测试(4)(Python):元素定位及操作...

在操作Web元素之前,需要先找到该元素,这个查找的过程称之为元素定位。Selenium支持8种元素定位方法:ID:根据元素的id属性值来定位元素。Name:根据元素的name属性值来定位元素。Class Name:根据元素的class属…

数据库定时导出和互备一例

环境:内网中有三台服务器做测试用,两台SUSE LINUX 10 和一台RHEL 5.5,都安装有ORACLE11G 需求:测试环境搭建完毕,因没有外部存储进行统一备份而修改和更新又比较频繁,所以需要在三台服务器间搭建互备以实现…

芯片公司急聘嵌入式软件精英人才

薪酬待遇及联系方式薪酬待遇:40~150万不等,另有股票期权等,待遇丰厚,详细面议工作地点:北京市朝阳区联系人:杨先生微信:MichaelYao7PS:推荐成功入职者有推荐费嵌入式软件工程师岗位职…

Python进程学习笔记-multiprocessing模块

如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序? 由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing模块就是跨…

这一年就要过去

「远方钟声响起,这一年就要过去,快乐时光不停留......」楠哥从幼儿园新学习了一首新年小曲。今年已经是12月份了,2021年就要结束,即将到来的是2022年的新的一年。2021年这一年里非常感谢读者的一路支持,当然这不是一篇…

Android 更改签名

本文来自:安卓航班网 签名和发布应用程序 要想使Android应用程序在真机上运行,需要对apk(Android应用程序的执行文件,相当于Symbian程序的sis/sisx或Java ME程序的jar文件)文件进行签名。可以通过命令行或ADT…

unc 隐藏共享文件夹_你真的了解任务栏吗?win10任务栏居然隐藏了这么多小窍门...

平常使用电脑,最常用的是桌面,桌面上最常用的大约是任务栏,但是你真的了解任务栏吗?除了一小部分朋友熟悉之外,大部分人估计都是没有留意到,其实任务栏就功能角度来说,的确算一个宝藏之地。什么…

c#调api串口通讯

c#调api串口通讯 原文:c#调api串口通讯在调试ICU通信设备的时候,由于串口通信老出现故障,所以就怀疑CF实现的SerialPort类是否有问题,所以最后决定用纯API函数实现串口读写。先从网上搜索相关代码(关键字:C# API 串口&…

手机充电IC设置电流与实测电流不一致问题剖析

大家好,我是写代码的篮球球痴,转一篇我朋友记得诚的文章本文转载来自一位基带大佬,解决问题的思路很重要。原文链接:https://blog.csdn.net/AirCity123/article/details/104428325?spm1001.2014.3001.5502某手机的充电架构如下&a…

今天面试了家公司

2011-07-08 不知不觉,做管理软件已经四五年了,今天面试了家做多媒体的公司,感觉不错,想转去做多媒体。转载于:https://blog.51cto.com/3298226/606809

checkbox居中 editor_radio 或 CheckBox 关联 其他元素 整体选择

场景: list组件中,每一行 需要显示多个radio 或者 checkBox,并且每一行显示选择的类型都不一样!radio 或checkBox 的选择数据源是存放另一个data组件中!! 思路:正常的想法是每一行放一个radioGr…

Spring系列(六) Spring Web MVC 应用构建分析

DispatcherServlet DispatcherServlet 是Spring MVC的前端控制器名称, 用户的请求到达这里进行集中处理, 在Spring MVC中, 它的作用是为不同请求匹配对应的处理器, 将结果传递给视图解析器最终呈现给客户端. 前端控制器模式(Front Controller Pattern)是…

做个好人,加个晚班

我和建平在腾讯加班的日子前几天,他让我给他发照片,因为公司里年末要发照片墙,他说要把我的和他的照片放上去,然后我硬是找了几张觉得不错的给他,然后他也真的放上去了。再看那些照片,拍出来的效果都不咋样…

使用use index优化sql查询

转自:http://www.cnblogs.com/edwardlost/archive/2010/12/31/1923105.html 先看一下arena_match_index的表结构,大家注意表的索引结构 CREATE TABLE arena_match_index ( tid int(10) unsigned NOT NULL DEFAULT 0, mid int(10) unsigned NOT NULL …

中ridge_10种线性代数在数据科学中的强大应用(内附多种资源)

原文选自 | Analytics Vidhya作者 | Khyati Mahendru本文转载自 TalkingData数据学堂 ,未经允许禁止转载本文摘要线性代数为各种各样的数据科学算法和应用提供支持在这里,我会向您介绍通过线性代数帮助您成为更好的数据科学家的10种实际应用我们已将这些…

排序算法之冒泡排序(JAVA)

//冒泡排序算法 平均时间复杂度 O(n*n) 稳定的排序算法 下面的是改进版的冒泡排序算法,使用exchange 标志位进行控制 public class bubbleSort { public static void bubbleSort(int[] data) { int i 0; int j 0; int tmp 0; int len …

C语言中变量的储存类别

C语言中变量的储存类别C语言中变量的储存类别1.动态存储方式与静态动态存储方式:从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。静态存储方式:是指在程序运行期间分配固定的存储空间的…

语言与golang语言运行速度_Golang语言情怀第13期 Go 语言设计模式 介绍

设计模式是什么俗话说:站在别人的肩膀上,我们会看得更远。设计模式的出现可以让我们站在前人的肩膀上,通过一些成熟的设计方案来指导新项目的开发和设计,以便于我们开发出具有更好的灵活性和可扩展性,也更易于复用的软…