当前位置: 首页 > news >正文

MS SQL入门基础:声明游标

  每一个游标必须有四个组成部分这四个关键部分必须符合下面的顺序;

  1.DECLARE 游标

  2.OPEN 游标

  3.从一个游标中FETCH 信息

  4.CLOSE 或DEALLOCATE 游标

  通常我们使用DECLARE 来声明一个游标声明一个游标主要包括以下主要内容: 游标名字 数据来源(表和列) 选取条件 属性(仅读或可修改)

  其语法格式如下:

  DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR

  FOR select_statement

  [FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]

  其中: cursor_name

  指游标的名字。 INSENSITIVE

  表明MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过

  游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。

  另外应该指出,当遇到以下情况发生时,游标将自动设定INSENSITIVE 选项。

  在SELECT 语句中使用DISTINCT、 GROUP BY、 HAVING UNION 语句;

  使用OUTER JOIN;

  所选取的任意表没有索引;

  将实数值当作选取的列。 SCROLL

  表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用该保留字,那么只能进行NEXT 提取操作。由此可见,SCROLL 极大地增加了提取数据的灵活性,可以随意读取结果集中的任一行数据记录,而不必关闭再

  重开游标。 select_statement

  是定义结果集的SELECT 语句。应该注意的是,在游标中不能使用COMPUTE、COMPU- TE BY、 FOR BROWSE、 INTO 语句。 READ ONLY

  表明不允许游标内的数据被更新尽管在缺省状态下游标是允许更新的。而且在UPDATE或DELETE 语句的WHERE CURRENT OF 子句中,不允许对该游标进行引用。 UPDATE [OF column_name[,…n]]

  定义在游标中可被修改的列,如果不指出要更新的列,那么所有的列都将被更新。当游标被成功创建后,游标名成为该游标的惟一标识,如果在以后的存储过程、触发器或Transact_SQL 脚本中使用游标,必须指定该游标的名字。1167831181_ddvip_6697.gif

  上面介绍的是SQL_92 的游标语法规则。下面介绍MS SQL SERVER 提供的扩展了的游标声明语法,通过增加另外的保留字,使游标的功能进一步得到了增强其语法规则为;

  1167831181_ddvip_6049.gif LOCAL

  定义游标的作用域仅限在其所在的存储过程、触发器或批处理中。当建立游标的存储过程执行结束后,游标会被自动释放。因此,我们常在存储过程中使用OUTPUT 保留字,将游标传递给该存储过程的调用者,这样在存储过程执行结束后,可以引用该游标变量,在该种情况下,直到引用该游标的最后一个就是被释放时,游标才会自动释放。 GLOBAL

  定义游标的作用域是整个会话层会话层指用户的连接时间它包括从用户登录到SQLSERVER 到脱离数据库的整段时间。选择GLOBAL 表明在整个会话层的任何存储过程、触发器或批处理中都可以使用该游标,只有当用户脱离数据库、时该游标才会被自动释放。

  注意:如果既未使用GLOBAL也未使用LOCAL,那么SQL SERVER将使用default local cursor数据库选项,为了与以彰的版本歉容,该选项常设置为FALSE。 FORWARD_ONLY

  选项指明在从游标中提取数据记录时,只能按照从第一行到最后一行的顺序,此时只能选用FETCH NEXT 操作。除非使用STATIC, KEYSET 和DYNAMIC 关键字,否则如果未指明是使用FORWARD_ONLY 还是使用SCROLL, 那么FORWARD_ONLY 将成为缺省选项,因为若使用STATIC KEYSET 和DYNAMIC 关键字,则变成了SCROLL 游标。另外如果使用了FORWARD_ONLY, 便不能使用FAST_FORWARD。 STATIC

  选项的含义与INSENSITIVE 选项一样,MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此对基本表的修改并不影响游标中的数据,即游标不会随着基本表内容的

  改变而改变,同时也无法通过游标来更新基本表。 KEYSET

  指出当游标被打开时,游标中列的顺序是固定的,并且MS SQL SERVER 会在tempdb内建立一个表,该表即为KEYSET KEYSET 的键值可惟一识别游标中的某行数据。当游标拥有者或其它用户对基本表中的非键值数据进行修改时,这种变化能够反映到游标中,所以游标用户或所有者可以通过滚动游标提限这些数据。

  当其它用户增加一条新的符合所定义的游标范围的数据时,无法由此游标读到该数据。因为Transact-SQL 服务器游标不支持INSERT 语句。

  如果在游标中的某一行被删除掉,那么当通过游标来提取该删除行时,@@FETCH_STATUS 的返回值为-2。 @@FETCH_STATUS 是用来判断读取游标是否成功的系统全局变量。

  由于更新操作包括两部分:删除原数据插入新数据,所以如果读取原数据,@@FETCH_STATUS 的返回值为-2; 而且无法通过游标来读取新插入的数据。但是如果使用了WHERE CURRENT OF 子句时,该新插入行数据便是可见的。

  注意:如果基础表未包含惟一的索引或主键,则一个KEYSET游标将回复成STATIC游标。 DYNAMIC

  指明基础表的变化将反映到游标中,使用这个选项会最大程度上保证数据的一致性。然而,与KEYSET 和STATIC 类型游标相比较,此类型游标需要大量的游标资源。 FAST_FORWARD

  指明一个FORWARD_ONLY, READ_ONLY 型游标。此选项已为执行进行了优化。如果SCROLL 或FOR_UPDATE 选项被定义,则FAST_FORWARD 选项不能被定义。 SCROLL_LOCKS

  指明锁被放置在游标结果集所使用的数据上当。数据被读入游标中时,就会出现锁。这个选项确保对一个游标进行的更新和删除操作总能被成功执行。如果FAST_FORWARD选项被定义,则不能选择该选项。另外,由于数据被游标锁定,所以当考虑到数据并发处理时,应避免使用该选项。 OPTIMISTIC

  指明在数据被读入游标后,如果游标中某行数据已发生变化,那么对游标数据进行更新或删除可能会导致失败。如果使用了FAST_FORWARD 选项,则不能使用该选项。 TYPE_WARNING

  指明若游标类型被修改成与用户定义的类型不同时,将发送一个警告信息给客户端。

  注意:不可以将SQL_92的游标语法规则与MS SQL SERVER的游标扩展用法混合在一起使用。   下面我们将总结一下声明游标时应注意的一些问题。

  如果在CURSOR 前使用了SCROLL 或INSENSITIVE 保留字,则不能在CURSOR 和FOR select_statement 之间使用任何的保留字。反之同理。

  如果用DECLARE CURSOR 声明游标时,没有选择READ_ONLY、 OPTIMISTIC 或SCROLL_LOCKS 选项时,游标的缺省情况为:

  如果SELECT 语句不支持更新,则游标为READ_ONLY;

  STATIC 和FAST_FORWARD 类型的游标缺省为READ_ONLY; 

  DYNAMIC 和KEYSET 游标缺省为OPTIMISTIC。

  我们仅能在Transact-SQL 语句中引用游标,而不能在数据库API 函数中引用。

  游标被声明以后,可以通过系统过程对其特性进行设置。

  对那些有权限对视图、表或某些列执行SELECT 语句的用户而言,它也具有使用游标的缺省权限。1167831181_ddvip_2327.gif
 1167831181_ddvip_4477.gif

相关文章:

  • 4.2 - 《机器学习基石》Home Work 1 Q.18-20
  • 修改SAP系统字段文本
  • 今天我的生日,纪念一下
  • Yii Framework 开发教程(关键是链接)Zii组件-ListView 示例
  • 技术开发频道一周精选2007-7-28
  • maven plugin的execution出错
  • 自动在Web.config中生成连接字符串
  • DNS服务器系列之二:高级配置之-DNS子域授权、区域转发、acl列表及view
  • 解决ASP.NET程序上传到虚拟主机的问题
  • [爱情] 『转载』女生写的追MM秘籍,看了马上告别光棍
  • 物流配送管理自动化采用无线传输解决方案
  • 80后管理:难以理解 但无法回避
  • PHP安全配置
  • 又一套BlogEngine主题Andreas
  • SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Angular4 模板式表单用法以及验证
  • CSS3 变换
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • iOS 系统授权开发
  • js
  • JS字符串转数字方法总结
  • Lsb图片隐写
  • Python语法速览与机器学习开发环境搭建
  • quasar-framework cnodejs社区
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spark RDD学习: aggregate函数
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Web标准制定过程
  • 安卓应用性能调试和优化经验分享
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 解决iview多表头动态更改列元素发生的错误
  • 小程序测试方案初探
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 函数计算新功能-----支持C#函数
  • ​ssh免密码登录设置及问题总结
  • ###项目技术发展史
  • (27)4.8 习题课
  • (C#)一个最简单的链表类
  • (LeetCode) T14. Longest Common Prefix
  • (zhuan) 一些RL的文献(及笔记)
  • (二)JAVA使用POI操作excel
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net 7 上传文件踩坑
  • .Net MVC + EF搭建学生管理系统
  • .net web项目 调用webService
  • .NET 设计模式初探
  • .Net环境下的缓存技术介绍
  • .NET开发人员必知的八个网站
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [HarmonyOS]第一课:从简单的页面开始
  • [hive] sql中distinct的用法和注意事项