数据库实验报告六_存储过程
- 格式:docx
- 大小:229.53 KB
- 文档页数:6
HUNAN UNIVERSITY
数据库
实验报告
学生姓名
学生学号
专业班级
指导老师
2017 年5月24日
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=-1
end 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 sc
drop column newgrade;/*在调用该存储过程前,需要先执行此语句,因为在创建存储过程时已经在sc表中添加了这个属性*/
首先创建存储过程,然后再调用存储过程,结果如下: