- 20
- 0
- 约 47页
- 2017-06-19 发布于湖北
- 举报
游标的种类 按处理特性: 静态游标 动态游标(缺省) 键集驱动游标 按游标结果集是否允许改动 只读游标 可写游标(缺省) 静态游标 打开静态游标时,SQL SERVER将游标结果集的所有数据行一次性复制到系统数据库Tempdb的临时表中,当基表中的数据发生变化时,游标的结果集并不相应的发生变化。 静态游标移动时消耗资源较少,但占用了较多的临时表空间。 动态游标 当滚动游标时,动态游标反应结果集中所作的所有修改,所有用户所作的全部UPDATE、INSERT、DELETE语句均通过游标可见。 当基表中的数据发生变化时,游标的结果集相应的发生变化。 动态游标移动时消耗资源较多,但占用了最少的临时表空间。 键集驱动游标 键集驱动游标介于静态游标和动态游标之间,兼有两者的特点。 打开键集驱动游标后,游标中的成员和行顺序是固定的。键集驱动游标由一套惟一标识符控制,这些惟一标识符就是键集。 用户对基表中的非关键值列插入数据或进行修改造成数据值的变化,在整个游标中都是可见。 键集驱动游标的键集在游标打开时建立在数据库tempdb中。 简单定义游标 都缺省的: 动态,向前遍历,可修改的游标 INSENSITIVE(不敏感游标,即静态游标) 定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用 SQL-92 语法时,如果省略 INSENSITIVE,(任何用户)对基表提交的删除和更新都反映在后面的提取中。 Transact-SQL扩展游标定义格式 游标变量 有两种方法建立游标和游标变量之间的关联: 第一种:先声明游标和游标变量,之后用SET语句将游标赋给游标变量。例如: DECLARE @cur_var CURSOR DECLARE C1 CURSOR FOR SELECT * FROM 课程表 SET @cur_var=C1 第二种:不声明游标,直接在SET语句中将各种游标定义赋给游标变量。例如: DECLARE @cur_var CURSOR SET @cur_var= CURSOR FOR SELECT * FROM 课程表 对游标进行操作的语句使用游标名称或游标变量引用游标。 游标变量的使用和释放示例 --取消游标变量和游标的关联。 DEALLOCATE @cur_var -- 游标C1依然存在。 FETCH NEXT FROM C1 GO -- 再次与游标建立关联。 DECLARE @cur_var2 CURSOR SET @cur_var2 = C1 -- 现在释放游标C1 。 DEALLOCATE C1 -- 但游标依然存在,因为被游标变量@ cur_var2引用着。 FETCH NEXT FROM @ cur_var2 -- 游标在批结束后,随着最后一个游标变量作用域的结束而最终被释放,因变量的作用域是定义它的批。 按第二种方法定义的未命名的游标 释放游标变量即释放游标 游标应用实例分析 【例】在开课表里,由于每一个开课号对应的学生选课都有限制,所以学生一旦选课确定,需要和该开课号的限选人数进行比对,如果没有超过限选人数,已选人数应及时更正。我们用插入语句在选课表了输入了一些数据,即进行了选课,但并没有采取必要的约束改变开课表里的已选人数(后面可以通过触发器进行处理),因此开课表和选课表的数据并不一致。为了纠正错误,可以使用游标,逐个检查并修改每个开课号在选课表中的学生选修人数,显示输出。 开课表 开课号 课程号 开课专业 开课年级 限选人数 已选人数 选课表里加一列开课号 10.3 游标应用实例分析 SET NOCOUNT ON DECLARE @开课号 CHAR(6), @限选人数 INT, @已选人数 INT DECLARE @message CHAR(80) --创建包含开课号、限选人数和已选人数信息的游标CUR_选课人数 DECLARE CUR_选课人数 cursor FOR SELECT 开课号,限选人数 FROM 开课表 FOR UPDATE OF 已选人数 SET NOCOUNT ON 当 SET NOCOUNT 为 ON 时,不返回计数 (表示受 Transact-SQL 语句影响的行数)。 当 SET NOCOUNT 为 OFF 时,返回计数。 即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。 当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息(,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DE
原创力文档

文档评论(0)