昆明理工大学数据库实验四
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
昆明理工大学信息工程与自动化学院学生实验报告
(2013 —2014 学年第一学期)
SQL之游标操作
课程名称:数据库开课实验室:系机房445 2013 年12 月 3日
年级、专业、班物联网111 学号201110410130 姓名杨国锋成绩
实验项目名称SQL DDL 操作指导教师贾连印
教师评语该同学是否了解实验内容与要求:A.了解□ B.基本了解□ C.不了解□
该同学的实验能力: A.强□ B.中等□ C.差□
该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□
实验报告是否规范: A.规范□ B.基本规范□ C.不规范□
是否有运行结果与分析: A.详细□ B.一般□ C.没有□
是否有总结与体会: A.详细□ B.一般□ C.没有□
教师签名:贾连印 2013年 12 月 3 日
一、实验的目的
1、掌握使用游标的基本步骤。
2、熟悉卷游标的使用
3、学习用游标解决实际问题
4、了解SQL的流程控制
教师关系T(T#, TNAME,TITLE)
课程关系C(C#,CNAME,T#)
学生关系S(S#,SNAME,AGE,SEX)
选课关系SC(S#,C#,SCORE)
二、实验内容与要求
在实验1、2创建的S、SC、C、T四个基本表的基础上,编写以下游标:1.实现一个游标,顺序读取并打印所有学生的学号、课程号、成绩信息,读取过程中删除S5的选课记录,并将为空的成绩修改为60分。
提示:编写过程中,可需参阅联机丛书获取下列内容的具体用法
1、声明变量可用declare,为变量赋值用set
2、需要判断可用if语句,如if内需执行多条语句,可用begin 和
end 来限定if作用的范围
3、可通过while循环来依次读取所有记录,读取状态可用
@@FETCH_STATUS获取
4、如游标已创建,但执行过程中出错。导致重新执行时提示游标
已存在,可用cursor_status来检查是否存在该游标,如存在,则先deallocate 2.实现一个卷游标,逆序打印所有学生的学号、课程号、成绩信息
三、实验主要步骤(要求包括每一步的sql语句,要求主要步骤有执行结果截
图,截图方法:可按住ALT键不放,同时按下PrtSc键)
基础知识:
游标也可以看作是一个表中的记录指针,该指针与某个查询结果相联系。在某一时刻,该指针只指向一条记录,即游标是通过移动指向记录的指针来处理数据的。当用户在SQL Server Management Studio中浏览记录时,总有一条记录的前面有一个黑色的三角标识,该标识就好像是一个记录指针。
游标通过以下方式来扩展结果处理:
1) 允许定位在结果集的特定行
2) 从结果集的当前位置检索一行或一部分行
3) 支持对结果集中当前位置的行进行数据修改
4) 存储过程和触发器中用于访问结果集中的数据的T-SQL语句
游标的基本操作:
--定义游标命令
declare demo1cursor for select*from c for read only;
--打开游标命令
open demo1;
--执行游标命令
fetch next from demo1;
--关闭游标命令
close demo1;
--删除游标命令
deallocate demo1;
fetch next from demo1; 每次执行一次数据
第一题:
--打印所有学生的学号、课程号、成绩信息
select*from SC;
--游标
--定义游标
declare@s#char(6),@c#char(6),@score int--定义变量
declare SCCUR cursor for select*from sc;--声明游标
open SCCUR
FETCH NEXT FROM SCCUR
into@s#,@c#,@score
while@@FETCH_STATUS=0
begin
if(@score is null)
begin
print'学号:'+@s#+' 课程号:'+@c#+' 成绩:'+'空'
end
else
print'学号:'+@s#+'课程号:'+@c#+'成绩:'+cast(@score as char(5))-- 类型转化
fetch next from sccur
into@s#,@c#,@score
end
CLOSE SCCUR
deallocate SCCUR
用游标查看整个表中的数据
下面删除s5的选课记录,并把成绩为空的的成绩修改为60
declare@s#char(6),@c#char(6),@score int--定义变量
declare SCCUR cursor for select*from sc;--声明游标
open SCCUR
FETCH NEXT FROM SCCUR
into@s#,@c#,@score
while@@FETCH_STATUS=0
begin
if(@score is null)
begin
set@score=60