声明游标

每一个游标必须有四个组成部分这四个关键部分必须符合下面的顺序;
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
    表明不允许伪昴诘氖荼桓戮」茉谌笔∽刺掠伪晔窃市砀碌摹6以赨PDATE或DELETE 语句的WHERE CURRENT OF 子句中,不允许对该游标进行引用。
  • UPDATE [OF column_name[,…n]]
    定义在游标中可被修改的列,如果不指出要更新的列,那么所有的列都将被更新。当游标被成功创建后,游标名成为该游标的惟一标识,如果在以后的存储过程、触发器或Transact_SQL 脚本中使用游标,必须指定该游标的名字。
    上面介绍的是SQL_92 的游标语法规则。下面介绍MS SQL SERVER 提供的扩展了的游标声明语法,通过增加另外的保留字,使游标的功能进一步得到了增强其语法规则为;
  • 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 语句的用户而言,它也具有使用游标的缺省权限。

时间: 2024-09-15 23:52:56

声明游标的相关文章

SQL-SERVER 声明游标

server|游标 SQL-SERVER 声明游标  每一个游标必须有四个组成部分这四个关键部分必须符合下面的顺序:1.DECLARE 游标2.OPEN 游标3.从一个游标中FETCH 信息4.CLOSE 或DEALLOCATE 游标通常我们使用DECLARE 来声明一个游标声明一个游标主要包括以下主要内容: 游标名字 数据来源(表和列) 选取条件 属性(仅读或可修改)其语法格式如下:DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSORFOR sel

MS SQL基础教程:声明游标

每一个游标必须有四个组成部分这四个关键部分必须符合下面的顺序: 1.DECLARE 游标 2.OPEN 游标 3.从一个游标中FETCH 信息 4.CLOSE 或DEALLOCATE 游标 通常我们使用DECLARE 来声明一个游标声明一个游标主要包括以下主要内容: 游标名字 数据来源(表和列) 选取条件 属性(仅读或可修改) 其语法格式如下: DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR FOR select_statement [FOR

PL/SQL游标(原创)

游标的相关概念及特性定义映射在结果集中某一行数据的具体位置,类似于C语言中的指针.即通过游标方式定位到结果集中某个特定的行,然后根据业务需求对该行进行相应特定的操作.游标的分类显示游标:即用户自定义游标,专门用于处理select语句返回的多行数据隐式游标:系统自动定义的游标,记录集只有单行数据,用于处理select into 和DML语句游标使用的一般过程:显示游标:声明, 打开, 读取, 关闭隐式游标:直接使用读取,声明.打开.关闭都是系统自动进行的显示游标的过程描述a.声明游标CURSOR

游标的应用

   在前面几节,我们详细介绍了如何声明游标,从游标中读取数据以及关闭.释放游标的方法.下面我们将给出几个应用实例使读者对游标有更为全面的了解. 13.7.1 游标变量的应用    我们已经提到游标是从MS SQL SERVER 7 版本才开始使用的新的变量类型,游标常被应用在存储过程.触发器中.那么游标是如何被作为变量而应用呢?看一下系统过程sp_cursor_list 的SQL 语句文本,会大有收获.    在该存储过程中,@cursor_return 为一游标变量,并将其结果集返回给其调用

关闭释放游标

13.5.1 关闭游标    1.使用CLOSE 命令关闭游标     在处理完游标中数据之后必须关闭游标来释放数据结果集和定位于数据记录上的锁.CLOSE 语句关闭游标,但不释放游标占用的数据结构.如果准备在随后的使用中再次打开游标,则应使用CLOSE 命令.其关闭游标的语法规则为: CLOSE { { [GLOBAL] cursor_name } | cursor_variable_name }    2.自动关闭游标    我们已经了解到游标可应用在存储过程.触发器和Transact_SQ

SQL Story摘录(十)————游标的应该与不应该

游标  游标概观 相信很多Delphi程序员都写过这样的代码: ... begin MyDataSet.Open; MyDataSet.Frist; while not ( MyDataSet.BOF or MyDataSet.EOF) do begin ... end; MyDataSet.Close; end; ... 很久以来,我们习惯了用这样的代码对数据库返回的数据进行逐行操作.在用客户端程序的代码打开数据集之前,我们把它当做是一个无序集合.不过,在需要时,我们在服务器端就可以直接以行操

Oracle数据库游标使用

oracle|数据|数据库|游标 SQL是用于访问ORACLE数据库的语言,PL/SQL扩展和加强了SQL的功能,它同时引入了更强的程序逻辑. PL/SQL支持DML命令和SQL的事务控制语句.DDL在PL/SQL中不被支持,这就意味作在PL/SQL程序块中不能创建表或其他任何对象.较好的PL/SQL程序设计是在PL/SQL块中使用象DBMS_SQL这样的内建包或执行EXECUTE IMMEDIATE命令建立动态SQL来执行DDL命令,PL/SQL编译器保证对象引用以及用户的权限. 下面我们将讨

什么是游标

1.游标的概念 游标是指向查询结果集的一个指针,它是一个通过定义语句与一条Select语句相关联的一组SQL语句.游标包含两方面的内容: ●游标结果集:执行其中的Select语句所得到的结果集: ●游标位置:一个指向游标结果集内的某一条记录的指针 利用游标可以单独操纵结果集中的每一行.游标在定义以后存在两种状态:关闭和打开.当游标关闭时,其查询结果集不存在:只有当游标打开时,才能按行读取或修改结果集中的数据. 2.使用游标 一个应用程序可以使用两种类型的游标:前端(客户)游标和后端(服务器)游标

理解Sybase游标的可用性和属性

游标的可用性 并非所有的接口都为所有的游标类型提供支持. ODBC和OLE DB(ADO)支持所有的游标类型. 嵌入式SQL支持所有的游标类型. ADO.NET只提供只进.只读游标. 对于 JDBC •jConnect 4.x只提供敏感性未定型游标. •jConnect 5.x支持所有类型的游标,但是可滚动游标会导致性能严重下降. •iAnywhere JDBC 驱动程序支持所有类型的游标. Sybase Open Client只支持敏感性未定型游标.此外,在使用可更新的非唯一游标时,会产生严重