大型数据库技术-实验五-游标
五、 实验内容及步骤
(1) 针对选课表定义一个只读游标,逐条输出有成绩的记录的学号,开课号,成绩(按成绩由高到低排序)。要求游标输出数据时不反应打开游标后对基本表的修改。执行结果如下图所示:
DECLARE CUR1 INSENSITIVE CURSOR
FOR
SELECT * FROM dbo.选课表
WHERE 成绩 IS NOT NULL
ORDER BY 成绩 DESC
OPEN CUR1
DECLARE @XUEHAO VARCHAR(20),@KAIKEHAO VARCHAR(20),@CHENGJI INT
FETCH NEXT FROM CUR1 INTO @XUEHAO,@KAIKEHAO,@CHENGJI
WHILE @@FETCH_STATUS=0
BEGIN
PRINT '学号'+@XUEHAO
PRINT '开课表'+@KAIKEHAO
PRINT '成绩'+CONVERT(VARCHAR(10),@CHENGJI)
PRINT('-------------------------')
FETCH NEXT FROM CUR1 INTO @XUEHAO,@KAIKEHAO,@CHENGJI
END
CLOSE CUR1
DEALLOCATE CUR1
GO
(2) 针对选课表定义一个只读游标,逐条输出有成绩的记录的学号,课程号,成绩(按成绩由高到低排序)。要求游标输出数据时反应打开游标后对基本表的修改。定义并打开游标后,通过其他连接将所有85的成绩修改为80,再逐条输出结果,执行结果如下图所示:
(注意:创建游标最好显式指定参数,如果采用SQL-92标准定义,需要指定SCROLL,如果采用T-SQL标准定义,需要指定为SCROLL或DYNAMIC,否则游标会默认创建为FAST_FORWARD,无法实现动态读取)
DECLARE CUR1 CURSOR DYNAMIC
FOR
SELECT * FROM dbo.选课表
WHERE 成绩 IS NOT NULL
ORDER BY 成绩 DESC
FOR READ ONLY
OPEN CUR1
DECLARE @XUEHAO VARCHAR(20),@KAIKEHAO VARCHAR(20),@CHENGJI INT
FETCH NEXT FROM CUR1 INTO @XUEHAO,@KAIKEHAO,@CHENGJI
WHILE @@FETCH_STATUS=0
BEGIN
PRINT '学号'+@XUEHAO
PRINT '开课号'+@KAIKEHAO
PRINT '成绩'+CONVERT(VARCHAR(10),@CHENGJI)
PRINT('---------------------------------')
FETCH NEXT FROM CUR1 INTO @XUEHAO,@KAIKEHAO,@CHENGJI
END
CLOSE CUR1
DEALLOCATE CUR1
GO
(3) 针对学生表定义一个游标,将游标中绝对位置为3的学生姓名改为你的姓名,并将性别改为你的性别。
DECLARE CUR CURSOR SCROLL
FOR
SELECT * FROM dbo.学生表
OPEN CUR
FETCH ABSOLUTE 3 FROM CUR
IF(@@FETCH_STATUS=0)
UPDATE dbo.学生表 SET 姓名='张家林',性别='男' WHERE CURRENT OF CUR
CLOSE CUR
DEALLOCATE CUR
GO
(4) 针对选课表定义一个游标,输出最高成绩记录和最低记录(如果有并列的,只需要输出一条即可)。执行结果如下图所示:
DECLARE CUR SCROLL CURSOR
FOR SELECT * FROM dbo.选课表
WHERE 成绩 IS NOT NULL
ORDER BY 成绩 DESC
OPEN CUR
FETCH FIRST FROM CUR
FETCH LAST FROM CUR
CLOSE CUR
DEALLOCATE CUR
GO
六、总结
这个实验主要是针对游标的使用方法。通过这次实验我充分理解游标的概念。并且掌握了游标的定义以及使用游标的方法。学会了用游标解决比较复杂的问题。游标在对表结构进行读取和修改功能都有着十分重要的作用,在定义的时候要注意游标的属性,是只读的还是可以修改的。游标这部分还是得多加练习,要记住游标的代码的逻辑,多背背就能记住。总之,这一部分内容还需要多敲代码才能运用的更加灵活,所以后面还需要多加练习。