1
数据库技术及应用
1.10.7.2 7.7.2 声明游标
7.7.2 声明游标

声明游标可以通过DECLARECURSOR语句完成,该语句包括两种格式,分别支持ISO标准的语法和TransacT-SQL扩展语法。

1.ISO标准的语法(SQL-92)

语法格式:

参数说明如下:

●cursor_name:是所定义的TransacT-SQL服务器游标的名称。cursor_name必须符合标识符规则。

●INSENSITIVE:系统将创建供所定义的游标使用的数据的临时复本,对游标的所有请求都从tempdb中的临时表中得到应答。因此,在对该游标进行提取操作时返回的数据中不反映对基本表所做的修改,并且该游标不允许修改。如果省略INSENSITIVE,则已提交的(任何用户)对基本表的删除和更新则会反映在后面的提取操作中。

●SCROLL:说明所声明的游标可以前滚、后滚。可使用所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)。如果省略SCROLL,则只能使用NEXT提取选项。

●select_statement:定义游标结果集的标准SELECT语句。在游标声明的select_statement中不允许使用关键字COMPUTE、COMPUTEBY、FORBROWSE和INTO。

●READONLY:说明该游标为只读游标,禁止进行更新。

●UPDATE[OFcolumn_name[,...n]]:定义游标中可更新的列。如果指定了OF column_name[,...n],则只允许修改所列出的列。如果指定了UPDATE,但未指定列的列表,则可以更新所有列。

以下是一个符合SQL-92标准的游标声明:

该语句定义的游标与单个表的查询结果集相关联,是只读的,游标只能按照从头到尾的顺序提取数据。

2.TransacT-SQL扩展语法

语法格式:

参数说明如下:

●cursor_name:是所定义游标的名称。

●LOCAL:指定游标的作用域。对于在其中创建的批处理、存储过程或触发器来说,该游标的作用域是局部的。该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程OUTPUT参数中,该游标可由局部游标变量引用。OUTPUT参数用于将局部游标传递回调用于批处理、存储过程或触发器,可在存储过程终止后给游标变量分配参数使其引用游标。除非OUTPUT参数将游标传递回来,否则游标将在批处理、存储过程或触发器终止时隐式释放。如果OUTPUT参数将游标传递回来,则游标在最后引用它的变量释放或离开作用域时释放。

●GLOBAL:指定该游标的作用域对连接是全局的。在由连接执行的任何存储过程或批处理中,都可以引用该游标名称。该游标仅在断开连接时隐式释放。

●FORWARD_ONLY|SCROLL:指定游标的移动方向。FORWARD_ONLY:游标只能从第一行滚动到最后一行;SCROLL同SQL92语法。

●STATIC|KEYSET|DYNAMIC|FAST_FORWARD:定义游标类型。TransacT-SQL扩展有4种类型,分别介绍如下:

静态游标。关键字STATIC指定游标为静态游标。与SQL 92标准的INSENSITIVE关键字功能相同。系统将创建由该游标使用的数据的临时复本。对游标的所有请求都从tempdb中的这一临时表中得到应答。因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。

键集驱动游标。关键字KEYSET定义一个键集驱动游标。这种游标是由称为键的列或列的组合控制的,当游标打开时,游标中行的成员身份和顺序已经固定。对行进行唯一标识的键集内置在tempdb内一个称为keyset的表中。

动态游标。关键字DYNAMIC指定游标为动态游标。与静态游标不同,动态游标能够反映对结果集中所做的更改。结果集中的行数据值、顺序和成员在每次提取时都会更改。动态游标不支持ABSOLUTE提取选项。

只进游标。关键字FAST_FORWARD定义一个快速只进游标,它是优化的只进游标,只支持游标按照从头到尾的顺序提取数据。

●READ_ONLY|SCROLL_LOCKS|OPTIMISTIC:说明游标或基本表的访问属性。READONLY是只读游标;SCROLL_LOCKS指定通过游标进行的定位更新或删除一定会成功,当将行读入游标时SQL Server将锁定这些行,以确保随后可对它们进行修改。如果还指定了FAST_FORWARD或STATIC,则不能指定SCROLL_LOCKS;OPTIMISTIC指明如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功,该选项不能与FAST_FORWARD同时使用。

●TYPE_WARNING:指定将游标从所请求的类型隐式转换为另一种类型时向客户端发送警告消息。

其他参数的含义同SQL-92标准的参数说明。

以下是一个TransacT-SQL扩展游标声明:

该语句声明一个名为STU_CUR2的动态游标,可前后滚动,对“出生日期”列进行修改。