实验报告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