《数据库实验报告六-存储过程(共6页).docx》由会员分享,可在线阅读,更多相关《数据库实验报告六-存储过程(共6页).docx(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上HUNAN UNIVERSITY数据库实验报告学生姓名 学生学号 专业班级 指导老师 2017 年5月 24日数据库系统概论实验报告(六)题目:PL/SQL存储过程姓名:Nomad日期:2017.5.24一、 实验环境1、 硬件:联想笔记本电脑2、 操作系统:Windows 7旗舰版3、 应用软件:MySQL 6.3,Navicat Preminum 11.2.16二、 实验内容熟悉使用存储过程来进行数据库应用程序的设计。1、 统计离散数学的成绩分布情况,即按照各分数段统计人数。代码如下:DELIMITER $ CREATE PROCEDURE sumScore()
2、/*统计课程离散数学 各分数段人数*/BEGIN declare less60 smallint default 0; /*90*/ declare countcno char(4) default *; SELECT Cno INTO countcno FROM course WHERE cname = 数学; /*确保course表中有数学这门课*/ SELECT COUNT(*) INTO less60 FROM sc WHERE cno = countcno AND grade = 60 AND grade = 70 AND grade = 80 AND grade = 90; /*将
3、结果存入新表sumScore中*/ create table sumScore( scorestage char(10), number smallint); insert into sumScore values(x60, less60); insert into sumScore values(60=x70, b60a70); insert into sumScore values(70=x80, b70a80); insert into sumScore values(80=x=90, more90);END$call sumScore(); /*调用上述存储过程*/首先创建存储过程,然
4、后再调用存储过程。结果如下:(上述结果图截自Navicat软件)可以看到,在stuinfo中新建了一个基本表sumscore,表中内容是数学课程成绩的各分数段的人数。2、 统计任意一门课的平均成绩。代码如下:DELIMITER $ CREATE PROCEDURE scoreAvg()BEGIN declare curname char(40) default null; /*临时存放课程名*/declare curcno char(4) default null; /*临时存放课程号*/declare curavg float; /*临时存放平均成绩*/declare mycursor cu
5、rsor for /*定义游标*/ select cno, cname from course;declare continue handler for not found set curavg=-1;open mycursor; /*打开游标*/fetch mycursor into curcno,curname; /*从结果集中取第一条记录到临时变量中*/repeat /*重复取记录*/select avg(grade) into curavg from sc where cno = curcno;insert into scoreAvg values(curcno,curname,cur
6、avg); /*将结果存入新表scoreAvg中*/fetch mycursor into curcno,curname;until curavg=-1end repeat; close mycursor; /*关闭游标*/END$call scoreAvg(); /*调用上述存储过程*/首先创建存储过程,然后再调用存储过程。结果如下:可以看到,在stuinfo中新建了一个基本表scoreavg,表中内容是各课程的平均成绩。3、 将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。代码如下:DELIMITER $ CREATE PROCEDURE changeRank() /*改变成绩等
7、级*/BEGIN declare chgrade char(1) default null; /*临时存放新的成绩等级*/ declare curcno smallint(6); /*临时存放课程号*/ declare curgrade int; /*临时存放成绩*/ declare flag int default 0; declare mycursor cursor for select cno,grade from sc; /*定义游标*/ declare continue handler for not found set flag=-1; /*在sc表中新建一列,用于存放新的成绩等级
8、*/ alter table sc add column(newgrade char(1); open mycursor; /*打开游标*/ fetch mycursor into curcno,curgrade; repeat /*当游标打开时进行下列循环处理*/ if curgrade 60 then set chgrade = E; elseif curgrade 70 then set chgrade = D; elseif curgrade 80 then set chgrade = C; elseif curgrade 90 then set chgrade = B; else s
9、et chgrade = A; end if; update sc set newgrade=chgrade where cno=curcno and grade=curgrade; fetch mycursor into curcno,curgrade; until flag=-1 /*直到游标指向空记录*/end repeat; close mycursor; /*关闭游标*/ select * from sc;END$SET SQL_SAFE_UPDATES=0; /*此步骤是必要的,否则将无法修改sc表*/call changeRank(); /*调用上述存储过程*/alter tab
10、le scdrop column newgrade; /*在调用该存储过程前,需要先执行此语句,因为在创建存储过程时已经在sc表中添加了这个属性*/首先创建存储过程,然后再调用存储过程,结果如下:可以看到,各成绩被赋予了新的等级。三、 出现的问题与解决方案1、 语句格式不正确。一开始按照课本上的格式来创建存储过程,结果无论是在MySQL还是Postgresql上都报语法错误,后来经网上查阅资料,按照MySQL的标准格式对代码进行修改后,可以执行。2、在本次实验中,创建的存储过程都是不带参数的,因此创建存储过程和调用存储过程都是执行相同的代码,有些语句被重复执行会报错,还有一些语句涉及修改基本表,但权限不够也会报错,对于这些,都需要做出相应的措施。比如上述的”SET SQL_SAFE_UPDATES=0;”和”alter table sc drop column newgrade;”。附录:MySQL源代码专心-专注-专业