游标
基本内容:(1)游标的概念;(2)定义、使用游标的方法;(3)用游标解决比较复杂的问题。
- 针对选课表定义一个只读游标,逐条输出有成绩的记录的学号,开课号,成绩。要求游标输出数据时不反应打开游标后对基本表的修改。执行结果如下图所示:
DECLARE MYCUR INSENSITIVE CURSOR --声明游标
FOR SELECT 学号,开课号,成绩 FROM 选课表
WHERE 成绩 IS NOT NULL
OPEN MUCUR --打开游标
DECLARE @XUEHAO VARCHAR(20),@KAIKEHAO VARCHAR(20),@CHENGJI VARCHAR(20)
FETCH NEXT FROM MYCUR INTO @XUEHAO,@KAIKEHAO,@CHENGJI
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT '学号'+@XUEHAO
PRINT '开课号'+@KAIKEHAO
PRINT '成绩 '+@CHENGJI
PRINT '---------------------'
FETCH NEXT FROM MYCUR INTO @XUEHAO,@KAIKEHAO,@CHENGJI
END
CLOSE MYCUR
DEALLOCATE MYCUR --释放游标
- 针对选课表定义一个只读游标,逐条输出有成绩的记录的学号,开课号,成绩(按成绩由高到低排序)。要求游标输出数据时不反应打开游标后对基本表的修改。执行结果如下图所示:
DECLARE MYCUR INSENSITIVE CURSOR -声明游标
FOR
SELECT 学号,开课号,成绩 FROM 选课表
WHERE 成绩 IS NOT NULL ORDER BY 成绩 DESC
OPEN MYCUR --打开游标
DECLARE @XUEHAO VARCHAR(20),@KAIKEHAO VARCHAR(20),@CHENGJI VARCHAR(20)
FETCH NEXT FROM MYCUR INTO @CUEHAO,@KAIKEHAO,@CHENGJI
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT '学号' @XUEHAO
PRINT '开课号' @KAIKEHAO
PRINT '成绩' @CHENGJI
FETCH NEXT FROM MYCUR INTO @XUEHAO,@KAIKEHAO,@CHENGJI
END
CLOSE MYCUR
DEALLOCATE MYCUR --释放游标
- 针对选课表定义一个只读游标,逐条输出有成绩的记录的学号,课程号,成绩(按成绩由高到低排序)。要求游标输出数据时反应打开游标后对基本表的修改。定义并打开游标后,通过其他连接将所有85的成绩修改为80,再逐条输出结果,执行结果如下图所示:
(注意:创建游标最好显式指定参数,如果采用SQL-92标准定义,需要指定SCROLL,
如果采用T-SQL标准定义,需要指定为SCROLL或DYNAMIC,否则游标会默认创建为
FAST_FORWARD,无法实现动态读取)
DECLARE MYCUR SCROLL CURSOR --显式参数
FOR
SELECT 学号,课程号,成绩 FROM 选课表
WHERE 成绩 IS NOT NULL ORDER BY 成绩 DESC
OPEN MYCUR --打开游标
UPDATE 选课表 SET 成绩=80 WHERE 成绩=85 --打开游标后更新
DECLARE @XUEHAO VARCHAR(20),@KAIKEHAO VARCHAR(20),@CHENGJI VARCHAR(20)
FETCH NEXT FROM MYCUR INTO @XUEHAO,@KAIKEHAO,@CHENGJI
WHILE @@FETCH_STATUS=0
BEGIN
PRINT '学号'+@XUEHAO
PRINT '开课号'+@KAIKEHAO
PRINT '成绩 '+@CHENGJI
FETCH NEXT FROM MYCUR INTO @XUEHAO,@KAIKEHAO,@CHENGJI
END
CLOSE MYCUR
DEALLOCATE MYCUR
- 针对学生表定义一个游标,将游标中绝对位置为3的学生姓名改为你的姓名,并将性别改为你的性别。
DECLARE MYCUR SCROLL CURSOR --滚动游标
FOR
SELECT * FROM 学生表
FOR UPDATE
OPEN MYCUR
FETCH ABSOLUTE 3 FROM MYCUR
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE 学生表 SET 姓名 'aaa',性别='bbb'
WHERE CURRENT OF MYCUR
END
CLOSE MYCUR
DEALLOCATE MYCUR
SELECT * FROM 学生表
- 针对选课表定义一个游标,输出最高成绩记录和最低记录(如果有并列的,只需要输出一条即可)。执行结果如下图所示:
DECLARE MYCUR SCROLL CURSOR --滚动游标
FOR
SELECT * FROM 选课表
WHERE 成绩 IS NOT NULL ORDER BY 成绩 DESC
OPEN MYCUR
FETCH FIRST FROM MYCUR
FETCH LAST FROM MYCUR
CLOSE MYCUR
DEALLOCATE MYCUR
总结
游标的优点:
- 允许程序对由SELECT查询语句返回的行集中的每一次执行相同或
相同的操作,而不是对整个集合执行同一个操作。 - 提供对基于游标位置中的行进行删除和更新的能力。
- 游标作为数据库管理系统和应用程序设计之间的桥梁,将两种
处理方式连接起来。