互评批阅
实验05 存储过程
互评指标:
(1)请根据参考答案进行评分 (2)若题目有扣分,务必在评语框中写明扣分理由
一. 简答题(共17题)
1. (简答题) 本实验的实验目的是:
/***的答案:/
掌握储存过程的概念,功能
学会创造和调用储存过程
知道修改和删除储存过程
/正确答案:/
(1)掌握存储过程的概念、功能
(2)学会创建和调用存储过程
(3)知道如何修改和删除存储过程
评分 分
评语
段落格式
字体
字号
点击上传
x
2. (简答题)
请写出下列创建存储过程的MySQL语句,存储过程名命名为
PROC_StuRepInfo_学号最后两位
利用学生学号查询该名学生各学期的选修课程情况,要求显示学生的学号,
姓名,选修的学年,学期,选修的课程号,课程名及其成绩,显示结果按学
年和学期升序排列。
/***的答案:/
delimiter $$
create procedure jxdb09.PROC_StuReplnfo_09(in xh char(10),out Sno
char(10))
begin
select S.Sno,Sname,Racademicyear,Rterm,C.Cno,Cname,Grade
from students09 S,reports09 R,courses09 C
where R.Sno=S.Sno and C.Cno=R.Cno and S.Sno=xh
order by Racademicyear,Rterm;
end $$
delimiter ;
/正确答案:/
DELIMITER //
CREATE PROCEDURE PROC_StuRepInfo(
Sid CHAR(10))
BEGIN
SELECT S.Sno, Sname, Racademicyear, Rterm, R.Cno, Cname, Grade
FROM Students S, Reports R, Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno
AND S.Sno=Sid
ORDER BY Racademicyear,Rterm;
END //
DELIMITER ;
评分 分
评语
段落格式
字体
字号
点击上传
x
3. (简答题)
请写出下列调用存储过程PROC_StuRepInfo_学号最后两位的MySQL语句,并
将执行结果截图,截图的右下角要求标上你的学号最后两位
查询学号为‘2015112101'的选课情况
/***的答案:/
set @Stu=null;
call PROC_StuReplnfo_09('2015112101',@Stu);
/正确答案:/
CALL Proc_StuRepInfo('2015112101');
评分 分
评语
段落格式
字体
字号
点击上传
x
4. (简答题)
请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_StuGrade_
学号最后两位
查询某位学生指定课程的成绩和可获得这门课程的学分
(注:若该学生的课程成绩小于60分或是为空,则学分要显示为0分)
/***的答案:/
delimiter $$
create procedure PROC_StuGrade_09(in Sn char(10),in Cn char(10))
BEGIN
DECLARE grade_09 CHAR(3);
DECLARE credit_09 INT;
select Grade INTO grade_09
from Reports09
where Cno = (select Cno from courses09 where Cname = Cn) AND
Sno = (SELECT Sno FROM Students09 WHERE Sname = SN);
IF grade_09 < 60 OR grade_09 IS NULL THEN
SET credit_09 = 0;
ELSE
SELECT Ceredit INTO credit_09 FROM Courses09 WHERE Cname=Cn ;
END IF;
select Sname,Cname,grade_09 ,credit_09
from Courses09 C,Reports05 R,Students09 S
where S.Sno =R.Sno and C.Cno = R.Cno and Sname=Sn and Cname=Cn;
end $$
/正确答案:/
DELIMITER //
CREATE PROCEDURE PROC_StuGrade(
SN VARCHAR(4),CN VARCHAR(20))
BEGIN
SELECT S.Sno,Sname,Cname,Grade,
(CASE
WHEN Grade<60 OR Grade IS NULL THEN 0
ELSE Ccredit
END) AS "Credit"
FROM Students S INNER JOIN Reports R ON S.Sno=R.Sno
INNER JOIN Courses C ON R.Cno=C.Cno
WHERE S.Sname=SN AND C.Cname=CN;
END //
DELIMITER ;
评分 分
评语
段落格式
字体
字号
点击上传
x
5. (简答题)
请写出下列调用存储过程PROC_StuGrade_学号最后两位的MySQL语句,并将
执行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询'张建国'选修的'数据库系统原理'课程的成绩和学分
(2)查询'朱玉玲'选修的'计算机科学概论'课程的成绩和学分
/***的答案:/
set @Sn = NULL and @Cn = NULL;
call PROC_StuGrade_09('张建国','数据库系统原理',@Sn,@Cn);
call PROC_StuGrade_09('朱玉玲','计算机科学概论',@Sn,@Cn);
/正确答案:/
(1)CALL Proc_StuGrade('张建国','数据库系统原理');
(2)CALL Proc_StuGrade('朱玉玲','计算机科学概论');
评分 分
评语
段落格式
字体
字号
点击上传
x
6. (简答题)
请写出下列创建存储过程的MySQL语句,存储过程名命名为
PROC_DepNativeInfo_学号最后两位
统计指定入学年级指定学院名中,各省的生源人数,要求显示入学年级,学
院名,生源地(只显示省份)及生源人数。
/***的答案:/
delimiter $$
create procedure PROC_DepNativeInfo_09(in xn char(10),in dn
char(20),out name char(10),out rs char(20))
begin
select left(Sno,4),Dname,left(Snative,2),count(*)
from department09 D,students09 S
where D.Dno=S.Dno and left(Sno,4)=xn and Dname=dn
group by left(Sno,4), Dname, left(Snative,2);
end $$
delimiter;
/正确答案:/
DELIMITER //
CREATE PROCEDURE PROC_DepNativeInfo(
StuGrd CHAR(4), DN VARCHAR(15))
BEGIN
SELECT LEFT(Sno,4) AS "入学年级", Dname AS "学院名",
LEFT(Snative,2) AS "省份", COUNT(Sno) AS "生源数"
FROM Students S, Department D
WHERE S.Dno=D.Dno AND LEFT(Sno,4)=StuGrd
AND Dname=DN
GROUP BY LEFT(Snative,2),LEFT(Sno,4),Dname;
END //
DELIMITER ;
评分 分
评语
段落格式
字体
字号
点击上传
x
7. (简答题)
请写出下列调用存储过程PROC_DepNativeInfo_学号最后两位的MySQL语句,
并将执行结果截图,截图的右下角要求标上你的学号最后两位
查询2014级计算机与信息工程学院的生源情况
/***的答案:/
set @xn=null and @dn=null;
call PROC_DepNativeInfo_09('2014','计算机与信息工程学院',@xn,@dn);
/正确答案:/
CALL PROC_DepNativeInfo('2014','计算机与信息工程学院');
评分 分
评语
段落格式
字体
字号
点击上传
x
8. (简答题)
请写出下列创建存储过程的MySQL语句,存储过程名命名为
PROC_StuGradeNum_学号最后两位
统计指定班级指定课程的考试情况,要求显示出不同分值段(10分为一个分
值段)以及尚未考试的学生人数,如(100~90,2人;89~80,7人;…未考,2人)。
/***的答案:/
delimiter $$
create procedure PROC_StuGradeNum_09(in bj char(10),in kc
char(20),out rs1 char(10),out rs2 char(10))
begin
select r.Cno,count(case when Grade>=90 and Grade<=100 then 1 end
) as '90~100',
count(case when Grade>=80 and Grade<=90 then 1 end )'80~90',
count(case when Grade>=70 and Grade<=80 then 1 end )'70~90',
count(case when Grade>=60 and Grade<=70 then 1 end )'60~70',
count(case when Grade>=50 and Grade<=60 then 1 end )'50~60',
count(case when Grade>=40 and Grade<=50 then 1 end )'40~50',
count(case when Grade>=30 and Grade<=40 then 1 end )'30~40',
count(case when Grade>=20 and Grade<=30 then 1 end )'20~30',
count(case when Grade>=10 and Grade<=20 then 1 end )'10~20',
count(case when Grade>=0 and Grade<=10 then 1 end )'0~10',
count(case when Grade=null then 1 end )'未考'
from reports09 r,courses09 c
where c.Cno=r.Cno and left(Sno,8)=bj and Cname=kc
group by Cno;
end $$
delimiter;
/正确答案:/
DELIMITER //
CREATE PROCEDURE PROC_StuGradeNum(
CLS CHAR(8), CN VARCHAR(20))
BEGIN
SELECT (CASE
WHEN Grade BETWEEN 90 AND 100 THEN '90~100'
WHEN Grade BETWEEN 80 AND 89 THEN '80~89'
WHEN Grade BETWEEN 70 AND 79 THEN '70~79'
WHEN Grade BETWEEN 60 AND 69 THEN '60~69'
WHEN Grade BETWEEN 0 AND 59 THEN '0~59'
ELSE '未考'
END
) AS "成绩分段", COUNT(Sno) AS "分段人数"
FROM Reports R,Courses C
WHERE R.Cno=C.Cno AND LEFT(Sno,8)=CLS AND Cname=CN
GROUP BY (CASE
WHEN Grade BETWEEN 90 AND 100 THEN '90~100'
WHEN Grade BETWEEN 80 AND 89 THEN '80~89'
WHEN Grade BETWEEN 70 AND 79 THEN '70~79'
WHEN Grade BETWEEN 60 AND 69 THEN '60~69'
WHEN Grade BETWEEN 0 AND 59 THEN '0~59'
ELSE '未考'
END);
END //
DELIMITER ;
评分 分
评语
段落格式
字体
字号
点击上传
x
9. (简答题)
请写出下列调用存储过程PROC_StuGradeNum_学号最后两位的MySQL语句,并
将执行结果截图,截图的右下角要求标上你的学号最后两位
查询20152101班计算机科学概论的考试情况
要求:若已获学分或未获学分返回为NULL,则结果要显示为0
/***的答案:/
set @bj=null and @kc=null;
call PROC_StuGradeNum_09('20152101','计算机科学概论',@bj,@kc);
/正确答案:/
CALL PROC_StuGradeNum('20152101','计算机科学概论');
评分 分
评语
段落格式
字体
字号
点击上传
x
10. (简答题)
请写出下列创建存储过程的MySQL语句,存储过程名命名为
PROC_StuCreditInfo_学号最后两位
利用学生学号查询该名学生在指定学年,指定学期所获得的学分数以及还未
获得的学分数,若该门课程尚无成绩或成绩小于60分,则为尚未获得的学
分,结果以变量形式输出(OUTPUT)。
/***的答案:/
delimiter $$
create procedure PROC_StuCreditInfo_09(in xh10 char(10),in xn10
char(10),in xq10 char(10))
begin
select Sno,Racademicyear,Rterm,sum(Ceredit)
from Courses09 C,Reports09 R
where C.Cno = R.Cno and Sno=xh10 and Racademicyear=xn10 and
Rterm=xq10
group by Racademicyear, Sno, Rterm;
end $$
delimiter;
/正确答案:/
DELIMITER //
CREATE PROCEDURE PROC_StuCreditInfo(
SN CHAR(10), ADyear INT, TM INT, OUT GetCredits INT, OUT
NotGetCredits INT)
BEGIN
SELECT SUM(Ccredit)
FROM Reports R, Courses C
WHERE R.Cno=C.Cno AND Sno=SN AND Racademicyear=ADyear
AND Rterm=TM AND Grade>=60
INTO GetCredits;
SELECT SUM(Ccredit)
FROM Reports R, Courses C
WHERE R.Cno=C.Cno AND Sno=SN AND Racademicyear=ADyear
AND Rterm=TM AND (Grade<60 OR Grade IS NULL)
INTO NotGetCredits;
END //
DELIMITER ;
评分 分
评语
段落格式
字体
字号
点击上传
x
11. (简答题)
请写出下列调用存储过程PROC_StuCreditInfo_学号最后两位的MySQL语句,
并将执行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询学号为2016115101的学生2017年第2学期的学分情况
(2)查询学号为2014112104的学生2014年第1学期的学分情况
要求:若已获学分或未获学分返回为NULL,则结果要显示为0
/***的答案:/
set @xh10=null;
call PROC_StuCreditInfo_09('2016115101','2017',2);
set @xh10=null;
call PROC_StuCreditInfo_09('2014112104','2014',1);
/正确答案:/
(1)
SET @GetCredit=0,@NotGetCredit=0;
CALL PROC_StuCreditInfo('2016115101',2017,2,@GetCredit,@NotGetCredit);
SELECT '2016115101' AS "学号",2017 AS "学年", 2 AS "学期",
IFNULL(@GetCredit,0) AS "已获学分", IFNULL(@NotGetCredit,0) AS "
未获学分";
(2)
SET @GetCredit=0,@NotGetCredit=0;
CALL PROC_StuCreditInfo('2014112104',2014,1,@GetCredit,@NotGetCredit);
SELECT '2014112104' AS "学号",2014 AS "学年", 1 AS "学期",
IFNULL(@GetCredit,0) AS "已获学分", IFNULL(@NotGetCredit,0) AS "
未获学分";
评分 分
评语
段落格式
字体
字号
点击上传
x
12. (简答题)
请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_TeaWork_学
号最后两位
统计指定教师指定学年的教学工作量(教学工作量=所有教授的课程学时数的
总和),教学工作量要求作为输出参数(OUT)
/***的答案:/
delimiter $$
create procedure PROC_TeaWork_09(in tn13 char(20),in xn13 char(10))
begin
declare Chours_12 char(10);
if Chour_12 is null then
set Chours_12=0;
else
select Chours into Chours_12
from courses09 c,tutors09 tu,teachers09 te
where c.Cno=tu.Cno and te.Tno=tu.Tno and Tname=tn13 and
Tacademicyear=xn13;
end if ;
select sum(Chours_12)
from courses09 c,tutors05 tu,teachers09 te
where c.Cno=tu.Cno and te.Tno=tu.Tno and Tname=tn13 and
Tacademicyear=xn13
group by te.Tno;
end $$
delimiter;
/正确答案:/
DELIMITER //
CREATE PROCEDURE PROC_TeaWork(
TN VARCHAR(4), ADyear INT, OUT CouHours INT)
BEGIN
SELECT SUM(Chours)
FROM Teachers T,Tutors TC,Courses C
WHERE T.Tno=TC.Tno AND TC.Cno=C.Cno
AND Tname=TN AND Tacademicyear=ADyear;
END //
DELIMITER ;
评分 分
评语
段落格式
字体
字号
点击上传
x
13. (简答题)
请写出下列调用存储过程PROC_TeaWork_学号最后两位的MySQL语句,并将执
行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询教师刘伟2018学年的教学工作量
(2)查询教师王一凡2016学年的教学工作量
要求:若教学工作量返回为NULL,则结果要显示为0
/***的答案:/
set @tn13=null;
call PROC_TeaWork_09('刘伟','2018');
call PROC_TeaWork_09('王一凡','2016');
/正确答案:/
(1)
SET @CourseHours=0;
CALL PROC_TeaWork('刘伟',2018,@CourseHours);
SELECT '刘伟' AS "教师姓名",2018 AS "学年",IFNULL(@CourseHours,0) AS
"教学工作量";
(2)
SET @CourseHours=0;
CALL PROC_TeaWork('王一凡',2016,@CourseHours);
SELECT '王一凡' AS "教师姓名",2016 AS "学年",IFNULL(@CourseHours,0)
AS "教学工作量";
评分 分
评语
段落格式
字体
字号
点击上传
x
14. (简答题)
请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_TeaTax_学
号最后两位
统计指定教师每月需要缴纳的税金是多少,并将统计结果以变量形式输出
(OUT)
如果是中级以下职称(含中级),则税金=(工资+岗位津贴-1500)*5%;
如果是副高级职称,则税金=(工资+岗位津贴-2000)*5%;
如果是正高级职称,则税金=(工资+岗位津贴-2500)*5%
提示:IF… ELSE…
注意:返回的税金应是实数
/***的答案:/
delimiter $$
create procedure PROC_TeaTax_05(in Tn char(10),out Ts char(20))
begin
select if(Tprof = '教授',(Tsal + Tcomm - 2500) * 5%,if(Tprof = '副教
授',(Tsal + Tcomm - 2000) * 5%,(Tsal + Tcomm - 1500) * 5%)) from
Teachers05 where Tn = Tname;
end $$
delimiter ;
drop procedure if exists PROC_TeaTax_05;
/正确答案:/
DELIMITER //
CREATE PROCEDURE PROC_TeaTax(
TN VARCHAR(4), OUT Ttax DECIMAL)
BEGIN
DECLARE tmp INT;
DECLARE prof VARCHAR(8);
SELECT Tprof FROM Teachers
WHERE Tname=TN
INTO prof;
IF (prof='教授') THEN
SET tmp=2500;
ELSEIF (prof='副教授') THEN
SET tmp=2000;
ELSE
SET tmp=1500;
END IF;
SELECT (Tsal+Tcomm-tmp)*0.05 FROM Teachers
WHERE Tname=TN
INTO Ttax;
END //
DELIMITER ;
评分 分
评语
段落格式
字体
字号
点击上传
x
15. (简答题)
请写出下列调用存储过程PROC_TeaTax_学号最后两位的MySQL语句,并将执
行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询教师张雪应缴纳的税金
(2)查询教师田锋应缴纳的税金
要求:显示的税金只保留小数点后两位
/***的答案:/
set @TL = NULL ;
call PROC_TeaTax_05('张雪',@TL);
set @TL = NULL ;
call PROC_TeaTax_05('田锋',@TL);
/正确答案:/
(1)
SET @Ttax=0.0;
CALL PROC_TeaTax('张雪',@Ttax);
SELECT '张雪' AS "教师姓名",FORMAT(@Ttax,2) AS "税金";
(2)
SET @Ttax=0.0;
CALL PROC_TeaTax('田峰',@Ttax);
SELECT '田峰' AS "教师姓名",FORMAT(@Ttax,2) AS "税金";
评分 分
评语
段落格式
字体
字号
点击上传
x
16. (简答题)
请写出下列创建存储过程的MySQL语句(选课情况综合查询),存储过程名命
名为PROC_StuRepSel_学号最后两位
此存储过程可按照用户指定的查询字段,包括学号,学生姓名,课程编号,
课程名称、学年或班级编号查询学生的选课情况,查询结果显示(班级编
号,学号,学生姓名,课程编号,课程名称,选修学年,选修学期,成绩)
提示:需要两个输入参数,一个参数用来指定要查询的字段,另一个参数用
来指定要查询字段的具体值,存储过程中需要根据查询字段不同,分别写出
对应的查询语句
/***的答案:/
delimiter $$
create procedure PROC_StuRepSel_05(in An char(10),in Bn char(10),out
Cn char(20))
begin
select Sclass,R.Sno,Sname,R.Cno,Cname,Racademicyear,Rterm,Grade
from Students05 S,Reports05 R,Courses05 C
where C.Cno = R.Cno and S.Sno = R.Sno and An in('学号','学生姓名','
课程编号','课程名称','学年','班级编号') and Bn in
(Sclass,R.Sno,Sname,R.Cno,Cname,Racademicyear);
end $$
delimiter ;
/正确答案:/
DELIMITER //
CREATE PROCEDURE PROC_StuRepSel(
SelColumn VARCHAR(8), SelValue VARCHAR(30))
BEGIN
CASE SelColumn
WHEN '学号' THEN
BEGIN
SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade
FROM Students S,Reports R,Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno
AND S.Sno=SelValue;
END;
WHEN '学生姓名' THEN
BEGIN
SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade
FROM Students S,Reports R,Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno
AND Sname=SelValue;
END;
WHEN '课程编号' THEN
BEGIN
SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade
FROM Students S,Reports R,Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno
AND C.Cno=SelValue;
END;
WHEN '课程名称' THEN
BEGIN
SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade
FROM Students S,Reports R,Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno
AND Cname=SelValue;
END;
WHEN '学年' THEN
BEGIN
SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade
FROM Students S,Reports R,Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno
AND Racademicyear=CONVERT(SelValue,SIGNED);
END;
WHEN '班级编号' THEN
BEGIN
SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade
FROM Students S,Reports R,Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno
AND Sclass=SelValue;
END;
ELSE
SELECT '未找到对应字段' AS '错误';
END CASE;
END //
DELIMITER ;
评分 分
评语
段落格式
字体
字号
点击上传
x
17. (简答题)
请写出下列调用存储过程PROC_StuRepSel_学号最后两位的MySQL语句,并将
执行结果截图,截图的右下角要求标上你的学号最后两位
(1)查询学号为2014112106的学生的选课情况
(2)查询20141151班的学生的选课情况
要求:显示的税金只保留小数点后两位
/***的答案:/
set @TL = NULL ;
call PROC_StuRepSel_05('学号','2014112106',@TL);
call PROC_StuRepSel_05('班级编号','20141151',@TL);
/正确答案:/
(1)CALL PROC_StuRepSel('学号','2014112106');
(2)CALL PROC_StuRepSel('班级编号','20141151');
评分 分
评语
段落格式
字体
字号
点击上传
x
一. 简答题
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15
* 16
* 17
总分:0分
客观题得分:0分
提交 <javascript:;>
<javascript:;>
提示
<javascript:;> <javascript:;>
<javascript:;>
提示
<javascript:;> <javascript:;>
提示
<javascript:;>
<javascript:;>
评分量表模板详情
确定 <javascript:;> 取消 <javascript:;>