实验报告3游标的使用
- 格式:doc
- 大小:703.50 KB
- 文档页数:9
山西大学计算机与信息技术学院
实验报告
姓 名 许小珍 学 号 2010242097 专业班级 软件一班
课程名称 数据库原理实验 实验日期 2012.04.17
成 绩 指导教师 庞继芳 批改日期
实验名称 游标的使用
一、实验目的:
掌握游标的使用方法; 掌握使用游标逐行操作SELECT语句结果集的数据的技能。
二、实验内容:
游标声明;打开游标;读取数据;关闭游标;释放游标
三、实验步骤:
1、声明游标。使用T-SQL语句生成一个结果集,并且定义游标的特征,如游标中的记录是否可以修改;
2、打开游标
3、推进游标指针,从游标的结果集中提取数据,从游标中检索一行或多行数据成为提取数据。
4、逐行处理游标指针所指向的行数据。
5、关闭和释放游标。
例1:查看学生表中年龄为19的学生的学号和姓名。
--声明游标
--use stu_DB
declare stuCur cursor
for
select sno,sname
from student
where sage=19
for read only
go
--打开游标
open stuCur
go
--处理游标中的数据
fetch next from stuCur
go
--关闭游标
close stuCur
--释放游标
deallocate stuCur
如图:
例2:
声明一个名称为Xuanke的游标
DECLARE XUANKE CURSOR
DYNAMIC
FOR
SELECT sno,grade
FROM sc
WHERE cno='02002'
FOR UPDATE OF sno
GO
OPEN XUANKE
GO
FETCH NEXT FROM XUANKE
GO
CLOSE XUANKE
DEALLOCATE XUANKE
例3:
声明一个游标,可前后滚动,可对选课表2中的成绩进行修改
use 学生选课
DECLARE XK CURSOR
FOR SELECT * FROM sc
FOR UPDATE OF grade
OPEN XK
SELECT '游标数据行数'=@@CURSOR_ROWS
FETCH NEXT FROM XK
CLOSE XK
例4:
为学生表中姓“李”的同学的行声明游标,并使用FETCH NEXT逐个提取这些行。(SCROLL 指定所有的提取选项FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE均可使用)
use sc
DECLARE STU SCROLL CURSOR
FOR
SELECT sname
FROM student
WHERE sname LIKE '李%'
ORDER BY sname
GO
OPEN STU
FETCH NEXT FROM STU
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM STU
END
@@FETCH_STATUS返回针对连接当前打开的任何游标发出的上一条游标 FETCH 语句的状态。
0 FETCH 语句成功。
-1 FETCH 语句失败或行不在结果集中。
-2 提取的行不存在
例5:
创建一个SCROLL游标,使其通过LAST, PRIOR, RELATIVE, ABSOLUTE 选项支持所有滚动能力。
NEXT:返回当前行的下一行,并使其为当前行。如果FETCH NEXT是对游标的第一次提取操作,则返回结果集中的第一行。NEXT为默认的游标提取选项。
PRIOR:返回当前行的前一行,并使其为当前行。如果FETCH PRIOR是对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。
FIRST:返回游标中的第一行并将其作为当前行。
LAST:返回游标中的最后一行并将其作为当前行。
use 学生选课
declare student scroll cursor for
select sname,sage
FROM student
open student
fetch last from student
fetch prior from student
fetch absolute 2 from student
fetch relative 3 from student
fetch relative -2 from student
使用游标修改数据
UPDATE和DELETE都是集合操作语句,如果只想修改或删除其中某个记录,则需要用带游标的SELECT语句查出所有满足条件的记录,从中进一步找出要修改或删除的记录,然后用CURRENT形式的UPDATE 和DELETE 语句修改或删除之。具体步骤:
1、用DECLARE语句声明游标,并指定FOR UPDATE OF column_name_list。
2、用OPEN语句打开游标。
3、用FETCH语句推进游标指针。
4、检查记录是否是需要修改或删除的记录。
5、处理完毕用CLOSE语句关闭游标。
用户可以在UPDATE 或DELETE 语句中使用游标来更新或删除表或视图中的行,但不能用来插入新行。
例6:
统计“数据结构”课程考试成绩的各分数段的分布情况。
use sc
declare course cursor
for
select grade from sc
where cno=(select cno from course
where cname='数据结构')
declare @p_100 smallint,@p_90 smallint,@p_80 smallint
declare @p_70 smallint,@p_60 smallint,@p_others smallint
declare @p_grade smallint
set @p_100=0
set @p_90=0
set @p_80=0
set @p_70=0
set @p_60=0
set @p_others=0
set @p_grade=0
open course
declare @p_100 smallint,@p_90 smallint,@p_80 smallint
declare @p_70 smallint,@p_60 smallint,@p_others smallint
declare @p_grade smallint
loop:
fetch next from course into @p_grade
if (@p_grade=100)set @p_100=@p_100+1
else if (@p_grade>=90)set @p_90=@p_90+1
else if (@p_grade>=80)set @p_80=@p_80+1
else if (@p_grade>=70)set @p_70=@p_70+1
else if (@p_grade>=60)set @p_60=@p_60+1
else set @p_others=@p_others+1
if (@@FETCH_STATUS =0)
goto loop
print str(@p_100)+','+str(@p_90)+','+str(@p_80)+','
print str(@p_70)+','+str(@p_60)+','+str(@p_others)
close course
deallocate course
例7:
定义一个游标,将学生表中所有学生的姓名、年龄显示出来。 use 学生选课
go
declare @sname varchar(50),@sage int //声明变量
declare stud scroll cursor
for
select sname,sage from student
for read only
open stud
declare @sname varchar(50),@sage int //声明变量
fetch from stud into @sname,@sage
while @@FETCH_STATUS=0
begin
print '学生姓名:'+@sname+' '+'学生年龄:'+str(@sage)
fetch from stud into @sname,@sage
end
close stud
deallocate stud
例8:
通过游标将学生表中第5位学生的年龄由19改为21
use 学生选课
go
declare stu scroll cursor
for
select sname, sage from student
for update of sage
open stu
fetch absolute 3 from stu
update student
set sage=23
where current of stu