任务3 使用变量保存游标数据
(三) 定义游标变量
CURSOR关键字还可以作为数据类型用于定义游标变量,其语法格式如下。
DECLARE {@变量名 CURSOR} [,…n]
游标变量定义后,必须和游标相关联才能实现游标操作。
•(1)分别定义游标变量与游标,之后用SET语句将游标赋给游标变量。•
【例4】定义游标变量,将前面定义的“学生_cura”游标赋给游标变量。
USE 教务数据库
GO
DECLARE @学生游标 CURSOR
SET @学生游标 = 学生_cura
•
(2)定义游标变量后,直接用SET语句创建游标与游标变量的关联。
【例5】定义游标变量,将游标变量与游标进行关联。
USE 教务数据库
GO
DECLARE @学生游标b CURSOR
SET @学生游标b = CURSOR
FOR SELECT * FROM 学生表
/*完整示例 */
USE 教务数据库
GO
DECLARE @学生游标b CURSOR
SET @学生游标b= CURSOR
FOR SELECT * FROM 学生表
OPEN @学生游标b
FETCH NEXT FROM @学生游标b
WHILE @@fetch_status = 0
BEGIN
FETCH NEXT FROM @学生游标b
END
CLOSE @学生游标b
DEALLOCATE @学生游标b
【例】 声明一个游标Cur_SX,并
•
使用存储过程sp_cursor_list 报告该游标的属性,SQL语句及运行结果如图所示。
USE 教务数据库
GO
DECLARE Cur_SX CURSOR FOR --声明游标Cur_SX
SELECT 姓名 --定义游标结果集(查询Name字段的结果)
FROM 学生表
WHERE 姓名 LIKE '刘%' --约束条件是以王开头的名字
OPEN Cur_SX --打开游标Cur_SX
DECLARE @Report CURSOR --声明游标变量@Report
--执行存储过程sp_cursor_list
EXEC master.dbo.sp_cursor_list @cursor_return = @Report OUTPUT,
@cursor_scope = 2 --报告所有全局游标
FETCH NEXT from @Report --提取紧跟当前行之后的结果行
WHILE (@@FETCH_STATUS <> -1) --如果FETCH语句执行成功
BEGIN
FETCH NEXT from @Report --继续提取紧跟当前行之后的结果行
END
CLOSE @Report --关闭游标@Report
DEALLOCATE @Report --释放游标@Report
GO
CLOSE Cur_SX --关闭游标Cur_SX
DEALLOCATE Cur_SX --释放游标Cur_SX
GO
练习:分析下面程序功能
SELECT * FROM 教务数据库.dbo.学生表
GO
UPDATE 教务数据库.dbo.学生表 SET 性别='女'
DECLARE cur1 CURSOR
FOR SELECT 学号,姓名,性别
FROM 教务数据库.dbo.学生表
where 学号='201905101'
FOR UPDATE OF 姓名,性别
OPEN cur1
GO
FETCH NEXT FROM cur1
GO
UPDATE 教务数据库.dbo.学生表
SET 姓名='谢小明'
WHERE CURRENT OF cur1
GO
CLOSE cur1
DEALLOCATE cur1
GO
SELECT * FROM 教务数据库.dbo.学生表
GO