文档介绍:第9章游标、事务与锁
本章学习目标
l   理解游标、事务的概念及作用
l 了解锁的相关知识
l 掌握并灵活运用游标和事务以提高系统开发效率
游标
游标及其作用
数据库的游标是类似于C语言指针的语言结构。通常情况下,数据库执行的大多数SQL命令都是同时处理集合内部的所有数据。但是,有时用户也需要对这些数据集合中的某一行进行操作。在没有游标的情况下,这种工作不得不放到数据库前端用高级语言来实现,这将导致不必要的数据传输,从而延长执行时间。通过使用游标就可以在服务器端有效地解决这个问题。
游标支持以下功能;
①在结果集中定位特定行。
②从结果集的当前位置检索行。
③支持对结果集中当前位置的行进行数据修改。
使用游标
游标主要用在存储过程、触发器和Transact_SQL脚本中。用户可以把它理解为一种特殊变量,也必须先声明后使用。游标的使用可以总结为6个步骤:声明游标、打开游标、提取数据、修改数据、关闭游标、释放游标。
1.       声明游标
声明游标的语法如下:
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
其中:
l         cursor_name :为游标名称。游标命名必须遵从Transact-SQL标识符规则。
l         INSENSITIVE:定义一个游标时将在tempdb数据库中创建一个临时表,用于存储由该游标提取的数据。任何通过这个游标进行的操作,都在这个临时表里进行。因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。如果省略 INSENSITIVE,那么用户对基表进行的任何操作都将在游标中反映出来。
l         SCROLL:指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在声明时未指定 SCROLL,则声明的游标只具有默认的 NEXT 功能。是唯一支持的提取选项。如果指定 SCROLL,则不能也指定 FAST_FORWARD。
l         select_statement:是定义游标结果集的标准SELECT 语句。PUTE BY、FOR BROWSE 和 INTO。
l         READ ONLY:设置游标为只读,使用该关键字时,不能通过该游标更新数据。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。
l         UPDATE [OF column_name [,...n]]:定义游标内可更新的列。如果指定 OF column_name [,...n] 参数,则只允许修改所列出的列。如果在 UPDATE 中未指定默认为可以更新所有列。
2.       打开游标
在使用游标之前,必须首先打开游标,方可执行指定操作。语法格式如下:
OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }
l         N: 该CURSOR所定义的数据已完全从表中读入,N为全部的数据行。
l         -M:该CURSOR所定义的数据未完全从表中读入,M为目前CURSOR数据子集内的数据行。
l         0:无符合条件的数据或该CURSOR已被关闭或释放。
l  -1:该游标为动态的,数据行经常变动无法确定。
其中:
l    GLOBAL:指定 cursor_name 为全局游标。
l    cursor_name:已声明的游标名称。如果全局游标和局部游标都使用 cursor_name 作为其名称,那么如果指定了 GLOBAL,cursor_name 指的是全局游标,否则 l   cursor_name 指的是局部游标。
打开一个游标以后,可以使用无参函数@***@ERROR来判断打开操作是否成功。如果这个函数的返回植为0,则表示游标打开成功,否则表示游标打开失败。当游标打开成功之后,可以使用无参函数@***@CURSOR_ROWS来获取这个游标中当前存在的记录行数。无参函数@***@CURSOR_ROWS有四种可能的取值:
3.       从游标中提取记录使用FETCH语句可以从游标中提取特定的一行记录。其语法格式如下:FETCH     [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | ***@nvar } |RELATIVE {n|***@n