任务六 数据库存储过程设计
文章目录
任务六 数据库存储过程设计
【实训目的与要求】
【实训原理】
【实训步骤】
一、定义、调用存储过程
1.创建不带参数的存储过程
2.创建带输入参数的存储过程
3.创建带输入、输出参数的存储过程
二、查看存储过程
1.使用SHOW STATUS语句查看存储过程的状态
2.从information_schema.Routines表中查看存储过程的信息
三、定义、调用存储函数
1.创建不带参数的存储函数
2.创建带参数的存储函数
【实训总结】
【实训目的与要求】
1、学会创建存储过程;
2、掌握存储过程的调用、查看、修改和删除存储过程。
3、学会创建存储函数;
4、掌握存储函数的调用、查看、修改和删除存储函数。
【实训原理】
MySQL自定义存储函数与存储过程。
【实训步骤】
参考任务二中提供的表数据内容,编写相应SQL语句,实现存储过程、存储函数的定义及调用。参考教材《数据库系统概论》P253-258的内容,以及《MySQL数据库入门》第6章P156-176的内容。
一、定义、调用存储过程
1.创建不带参数的存储过程
(1)功能:创建一个存储过程,返回软件专业本班1998出生的学生学号,姓名,性别,所获学分情况。
命令:(包括存储过程定义及调用)
DELIMITER //
mysql> CREATE PROCEDURE PRO1()
-> BEGIN
-> SELECT SNo,SName,CNo,CName
-> FROM student
-> WHERE SNo LIKE"16041%" AND SBir LIKE"1998%";
-> END//
mysql> DELIMITER ;
mysql> CALL PRO1();
截图:
(2)功能:查询各学科的最高分,并输出对应科目的学科号和学科名
命令:
DELIMITER //
mysql> CREATE PROCEDURE MAX_SCORE()
-> BEGIN
-> SELECT sc.CNo,CName,MAX(Score)
-> FROM sc,course
-> WHERE sc.CNo=course.CNo
-> GROUP BY sc.CNo;
-> END//
mysql> DELIMITER ;
mysql> CALL MAX_SCORE();
截图:
2.创建带输入参数的存储过程
(1)功能:创建一个存储过程,实现查询某门课程成绩在60~90之间的男学生名单。
(调用存储过程:假设查询“C语言”课程成绩在60~90之间的男学生的名单,调用存储过程,验证该存储过程的定义正确与否。
提示:查询可以用多表连接实现,也可以用in子查询实现。)
命令:(包括存储过程定义及调用)
DELIMITER //
mysql> CREATE PROCEDURE NAME(IN ICName varchar(8),IN ISex varchar(2))
-> BEGIN
-> SELECT student.SNo,SName
-> FROM sc,student
-> WHERE CNo=(SELECT CNo
-> FROM course
-> WHERE CName=ICName)
-> AND Score>=60 AND Score<=90 AND sc.SNo=student.SNo AND SSex=ISex;
-> END//
mysql> DELIMITER ;
mysql> CALL NAME("C语言","男");
截图:
(2)功能:输出对应同学的总分,以及该同学不及格的科目及分数
命令:
DELIMITER //
mysql> CREATE PROCEDURE LOW_SCORE(IN ISNo varchar(8))
-> BEGIN
-> SELECT *
-> FROM sc,(SELECT SUM(Score),SNo
-> FROM sc
-> GROUP BY SNo) AS A
-> WHERE ISNo=sc.SNo AND sc.SNo=A_SNo AND Score<60;
-> END//
截图:
3.创建带输入、输出参数的存储过程
(1)功能:创建一个存储过程,实现计算全体学生某门功课的平均成绩的功能。
(调用存储过程:请自行给出指定的课程,验证该存储过程的定义正确与否。)
命令:(包括存储过程定义及调用)
DELIMITER //
mysql> CREATE PROCEDURE AVG_Score(IN ICName varchar(8),OUT OUTCName varchar(8),OUT Score DECIMAL(5,2))
-> BEGIN
-> SELECT CName into OUTCName
-> FROM course
-> WHERE CName=ICName;
-> SELECT AVG(Score) INTO Score
-> FROM sc,(SELECT CNo TCNo
-> FROM course
-> WHERE CName=ICName) AS T
-> WHERE CNo=TCNo
-> GROUP BY CNo;
-> END//
mysql> DELIMITER ;
mysql> CALL AVG_Score("C语言",@OUTCName,@Score);
截图:
(2)功能:查询每个科目获得第一名的分数及其学号和姓名
命令:
DELIMITER //
mysql> Create procedure Top1_score(IN icname varchar(8),OUT outsname varchar(8),OUT outsno varchar(8),OUT SCO int)
-> BEGIN
-> select SName into outsname
-> from sc,student,(select CNo Tcno
-> from course
-> Where CName= icname
-> )
-> AS T
-> Where CNo=Tcno and sc.SNo=student.SNo
-> order by Score desc limit 0,1;
-> select SNo into outsno
-> from sc,(select CNo Tcno
-> from course
-> Where CName= icname)AS T
-> Where CNo=Tcno
-> order by Score desc limit 0,1;
-> select Score into SCO
-> from sc ,(select CNo Tcno
-> from course
-> Where CName= icname) AS T
-> Where CNo=Tcno
-> order by Score desc limit 0,1;
-> END//
截图:
二、查看存储过程
1.使用SHOW STATUS语句查看存储过程的状态
(1)功能:查询带有Score字符的存储过程的状态
命令:
mysql> SHOW PROCEDURE STATUS LIKE "%Score%"\G;
截图:
2.从information_schema.Routines表中查看存储过程的信息
(1)功能:查询存储过程名中含有Score字符的存储过程的信息
命令:
mysql> select * from information_schema.Routines
-> where ROUTINE_NAME like "%Score";
截图:
三、定义、调用存储函数
1.创建不带参数的存储函数
(1)功能:创建一个存储函数,返回student表中学生的数目作为结果,有结果返回实际学生数,无结果显示“此表为空”。
命令:(包括存储函数定义及调用)
Delimiter //
mysql> Create function student_number()
-> Returns int(6)
-> Begin
-> Declare sum int(6);
-> Declare note char(6);
-> set note="此表为空";
-> select count(*) into sum
-> From student;
-> If sum=0 then
-> return note;
-> Else return sum;
-> End if;
-> End//
截图:
(2)功能:查询“数据结构”的最高分
命令:
Delimiter //
mysql> Create function score_max()
-> Returns int(6)
-> Begin
-> Declare sum int(6);
-> Declare note char(6);
-> set note="此表为空";
-> select max(score) into sum
-> From sc
-> Where cno="00004"
-> group by cno;
-> return sum;
-> end//
截图:
2.创建带参数的存储函数
(1)功能:创建一个存储函数,实现计算全体学生某门功课的平均成绩的功能。
命令:(包括存储函数定义及调用)
mysql> Create function avg_score( icname varchar(8))
-> Returns varchar(255)
-> BEGIN
-> Declare a_score varchar(255);
-> select avg(score) INTO a_score
-> from sc ,(select cno Tcno
-> From course
-> Where cname= icname
-> )
-> As T
-> Where cno=Tcno
-> group by cno;
-> return a_score;
-> END//
截图:
(2)功能:查询学号为16044905同学的总成绩
命令:
Delimiter //
mysql> Create function sum_score( Tisno varchar(8))
-> Returns varchar(255)
-> BEGIN
-> Declare sum_score varchar(255);
-> select sum(score) INTO sum_score
-> From sc
-> Where sno=Tisno
-> group by sno;
-> return sum_score;
-> END//
截图:
【实训总结】
这一章的存储过程较为复杂,需要多加练习,所学知识与实践相结合才算是学到知识。