SQL-SERVER 声明游标

None.gif SQL - SERVER 声明游标 
None.gif     
None.gif  
None.gif
None.gif每一个游标必须有四个组成部分这四个关键部分必须符合下面的顺序;
None.gif
1 . DECLARE  游标
None.gif
2 . OPEN  游标
None.gif
3 .从一个游标中FETCH 信息
None.gif
4 . CLOSE  或DEALLOCATE 游标
None.gif通常我们使用DECLARE 来声明一个游标声明一个游标主要包括以下主要内容: 
None.gif游标名字 
None.gif数据来源(表和列) 
None.gif选取条件 
None.gif属性(仅读或可修改)
None.gif其语法格式如下:
None.gif
DECLARE  cursor_name  [ INSENSITIVE ]   [ SCROLL ]   CURSOR
None.gif
FOR  select_statement
None.gif
[ FOR {READ ONLY | UPDATE [OF column_name [,dot.gifn ] ]}]
None.gif其中: 
None.gifcursor_name
None.gif指游标的名字。 
None.gifINSENSITIVE
None.gif表明MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过
None.gif游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。
None.gif
None.gif另外应该指出,当遇到以下情况发生时,游标将自动设定INSENSITIVE 选项。
None.gif在SELECT 语句中使用DISTINCT、 
GROUP   BY 、  HAVING   UNION  语句;
None.gif使用OUTER 
JOIN
None.gif所选取的任意表没有索引;
None.gif将实数值当作选取的列。 
None.gifSCROLL
None.gif表明所有的提取操作(如FIRST、 LAST、 PRIOR、 
NEXT 、 RELATIVE、 ABSOLUTE)都可用。如果不使用该保留字,那么只能进行NEXT 提取操作。由此可见,SCROLL 极大地增加了提取数据的灵活性,可以随意读取结果集中的任一行数据记录,而不必关闭再
None.gif重开游标。 
None.gifselect_statement
None.gif是定义结果集的SELECT 语句。应该注意的是,在游标中不能使用COMPUTE、COMPU
-  TE  BY 、  FOR   BROWSE 、  INTO  语句。 
None.gif
READ   ONLY
None.gif表明不允许游标内的数据被更新尽管在缺省状态下游标是允许更新的。而且在UPDATE或DELETE 语句的WHERE 
CURRENT   OF  子句中,不允许对该游标进行引用。 
None.gif
UPDATE   [ OF column_name[,…n ] ]
None.gif定义在游标中可被修改的列,如果不指出要更新的列,那么所有的列都将被更新。当游标被成功创建后,游标名成为该游标的惟一标识,如果在以后的存储过程、触发器或Transact_SQL 脚本中使用游标,必须指定该游标的名字。
None.gif上面介绍的是SQL_92 的游标语法规则。下面介绍MS SQL SERVER 提供的扩展了的游标声明语法,通过增加另外的保留字,使游标的功能进一步得到了增强其语法规则为;
None.gif 
None.gifLOCAL
None.gif定义游标的作用域仅限在其所在的存储过程、触发器或批处理中。当建立游标的存储过程执行结束后,游标会被自动释放。因此,我们常在存储过程中使用OUTPUT 保留字,将游标传递给该存储过程的调用者,这样在存储过程执行结束后,可以引用该游标变量,在该种情况下,直到引用该游标的最后一个就是被释放时,游标才会自动释放。 
None.gifGLOBAL
None.gif定义游标的作用域是整个会话层会话层指用户的连接时间它包括从用户登录到SQLSERVER 到脱离数据库的整段时间。选择GLOBAL 表明在整个会话层的任何存储过程、触发器或批处理中都可以使用该游标,只有当用户脱离数据库、时该游标才会被自动释放。
None.gif注意:如果既未使用GLOBAL也未使用LOCAL,那么SQL SERVER将使用default local cursor数据库选项,为了与以彰的版本歉容,该选项常设置为FALSE。 
None.gifFORWARD_ONLY
None.gif选项指明在从游标中提取数据记录时,只能按照从第一行到最后一行的顺序,此时只能选用FETCH 
NEXT  操作。除非使用STATIC, KEYSET 和DYNAMIC 关键字,否则如果未指明是使用FORWARD_ONLY 还是使用SCROLL, 那么FORWARD_ONLY 将成为缺省选项,因为若使用STATIC KEYSET 和DYNAMIC 关键字,则变成了SCROLL 游标。另外如果使用了FORWARD_ONLY, 便不能使用FAST_FORWARD。 
None.gifSTATIC
None.gif选项的含义与INSENSITIVE 选项一样,MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此对基本表的修改并不影响游标中的数据,即游标不会随着基本表内容的
None.gif改变而改变,同时也无法通过游标来更新基本表。 
None.gifKEYSET
None.gif指出当游标被打开时,游标中列的顺序是固定的,并且MS SQL SERVER 会在tempdb内建立一个表,该表即为KEYSET KEYSET 的键值可惟一识别游标中的某行数据。当游标拥有者或其它用户对基本表中的非键值数据进行修改时,这种变化能够反映到游标中,所以游标用户或所有者可以通过滚动游标提限这些数据。
None.gif
None.gif    当其它用户增加一条新的符合所定义的游标范围的数据时,无法由此游标读到该数据。因为Transact
- SQL 服务器游标不支持INSERT 语句。
None.gif    如果在游标中的某一行被删除掉,那么当通过游标来提取该删除行时,
@@FETCH_STATUS  的返回值为 - 2 。  @@FETCH_STATUS  是用来判断读取游标是否成功的系统全局变量。
None.gif    由于更新操作包括两部分:删除原数据插入新数据,所以如果读取原数据,
@@FETCH_STATUS  的返回值为 - 2 ; 而且无法通过游标来读取新插入的数据。但是如果使用了WHERE  CURRENT   OF  子句时,该新插入行数据便是可见的。
None.gif注意:如果基础表未包含惟一的索引或主键,则一个KEYSET游标将回复成STATIC游标。 
None.gifDYNAMIC
None.gif指明基础表的变化将反映到游标中,使用这个选项会最大程度上保证数据的一致性。然而,与KEYSET 和STATIC 类型游标相比较,此类型游标需要大量的游标资源。 
None.gifFAST_FORWARD
None.gif指明一个FORWARD_ONLY, READ_ONLY 型游标。此选项已为执行进行了优化。如果SCROLL 或FOR_UPDATE 选项被定义,则FAST_FORWARD 选项不能被定义。 
None.gifSCROLL_LOCKS
None.gif指明锁被放置在游标结果集所使用的数据上当。数据被读入游标中时,就会出现锁。这个选项确保对一个游标进行的更新和删除操作总能被成功执行。如果FAST_FORWARD选项被定义,则不能选择该选项。另外,由于数据被游标锁定,所以当考虑到数据并发处理时,应避免使用该选项。 
None.gifOPTIMISTIC
None.gif指明在数据被读入游标后,如果游标中某行数据已发生变化,那么对游标数据进行更新或删除可能会导致失败。如果使用了FAST_FORWARD 选项,则不能使用该选项。 
None.gifTYPE_WARNING
None.gif指明若游标类型被修改成与用户定义的类型不同时,将发送一个警告信息给客户端。
None.gif注意:不可以将SQL_92的游标语法规则与MS SQL SERVER的游标扩展用法混合在一起使用。 
None.gif    下面我们将总结一下声明游标时应注意的一些问题。
None.gif    如果在CURSOR 前使用了SCROLL 或INSENSITIVE 保留字,则不能在CURSOR 和FOR select_statement 之间使用任何的保留字。反之同理。
None.gif    如果用DECLARE 
CURSOR  声明游标时,没有选择READ_ONLY、 OPTIMISTIC 或SCROLL_LOCKS 选项时,游标的缺省情况为:
None.gif    如果SELECT 语句不支持更新,则游标为READ_ONLY;
None.gif    STATIC 和FAST_FORWARD 类型的游标缺省为READ_ONLY;   
None.gif    DYNAMIC 和KEYSET 游标缺省为OPTIMISTIC。
None.gif    我们仅能在Transact
- SQL 语句中引用游标,而不能在数据库API 函数中引用。
None.gif    游标被声明以后,可以通过系统过程对其特性进行设置。
None.gif    对那些有权限对视图、表或某些列执行SELECT 语句的用户而言,它也具有使用游标的缺省权限。
None.gif
None.gif 
None.gif 
None.gif

转载于:https://www.cnblogs.com/jhobo/archive/2007/01/08/614783.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值