数据库实验报告六-存储过程(共6页).docx
精选优质文档-倾情为你奉上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() /*统计课程离散数学 各分数段人数*/BEGIN declare less60 smallint default 0; /*<60*/ declare b60a70 smallint default 0; /*6070*/ declare b70a80 smallint default 0; /*7080*/ declare b80a90 smallint default 0; /*8090*/ declare more90 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; SELECT COUNT(*) INTO b60a70 FROM sc WHERE cno = countcno AND grade >= 60 AND grade < 70; SELECT COUNT(*) INTO b70a80 FROM sc WHERE cno = countcno AND grade >= 70 AND grade < 80; SELECT COUNT(*) INTO b80a90 FROM sc WHERE cno = countcno AND grade >= 80 AND grade < 90; SELECT COUNT(*)INTO more90 FROM sc WHERE cno = countcno AND grade >= 90; /*将结果存入新表sumScore中*/ create table sumScore( scorestage char(10), number smallint); insert into sumScore values('x<60', less60); insert into sumScore values('60<=x<70', b60a70); insert into sumScore values('70<=x<80', b70a80); insert into sumScore values('80<=x<90', b80a90); insert into sumScore values('x>=90', more90);END$call sumScore(); /*调用上述存储过程*/首先创建存储过程,然后再调用存储过程。结果如下:(上述结果图截自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 cursor 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,curavg); /*将结果存入新表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() /*改变成绩等级*/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表中新建一列,用于存放新的成绩等级*/ 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 set 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 table scdrop column newgrade; /*在调用该存储过程前,需要先执行此语句,因为在创建存储过程时已经在sc表中添加了这个属性*/首先创建存储过程,然后再调用存储过程,结果如下:可以看到,各成绩被赋予了新的等级。三、 出现的问题与解决方案1、 语句格式不正确。一开始按照课本上的格式来创建存储过程,结果无论是在MySQL还是Postgresql上都报语法错误,后来经网上查阅资料,按照MySQL的标准格式对代码进行修改后,可以执行。2、在本次实验中,创建的存储过程都是不带参数的,因此创建存储过程和调用存储过程都是执行相同的代码,有些语句被重复执行会报错,还有一些语句涉及修改基本表,但权限不够也会报错,对于这些,都需要做出相应的措施。比如上述的”SET SQL_SAFE_UPDATES=0;”和”alter table sc drop column newgrade;”。附录:MySQL源代码专心-专注-专业