数据库系统SSD7 实验4 《存储过程》(MySQL)
一、实验目的
理解存储过程的概念、建立和调用方法。进一步熟悉SQL语句对数据库进行完整性控制的方法。
二、实验内容
1、利用存储过程查找自己的学号、选修课程及成绩。
2、利用存储过程查找姓“李”并且性别为“M”的学生学号、选修课程。
3、利用存储过程计算某同学(学号作为存储过程的参数)所选课程的平均分。
三、实验方法与实验步骤
1、设计查找自己的学号、选修课程及成绩的存储过程,以自己的学号作为参数,调用存储过程。
2、设计存储过程查找姓“李”并且性别为“M”的学生学号、选修课程并调用。
3、设计存储过程计算某同学(学号作为存储过程的参数)所选课程的平均分并调用。
大部分情况根据实验要求写出相应的SQL语句,新建查询并运行、调试即可。创建存储过程可以使用mysql的控制台应用创建,也可以使用Navicat的函数模块进行创建(创建的类型选择“过程”),可以在查询中使用sql语句调用执行存储过程。
四、实验结果
以下为相应的SQL语句。
1、设计查找自己的学号、选修课程及成绩的存储过程,以自己的学号作为参数,调用存储过程。
mysql数据库设计存储过程exp4-1
如下:
DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `exp4-1`(IN `stu_no` varchar(20))
BEGIN
SELECT sc.Sno, sc.Cno, sc.grade FROM sc WHERE sc.Sno=stu_no;
END
//
DELIMITER ;
调用该存储过程:
SET @stu_no='1234567893';
CALL `exp4-1`(@stu_no);
结果:
2、设计存储过程查找姓“李”并且性别为“M”的学生学号、选修课程并调用。
mysql数据库设计存储过程exp4-2
如下:
DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `exp4-2`()
BEGIN
SET @s_name='李%';
SET @s_sex='M';
SELECT sc.Sno, s.Sname, sc.Cno FROM sc, s
WHERE sc.Sno=s.Sno
AND s.Ssex=@s_sex
AND s.Sname LIKE @s_name;
END
//
DELIMITER ;
调用:
CALL `exp4-2`()
结果:
3、设计存储过程计算某同学(学号作为存储过程的参数)所选课程的平均分并调用。
mysql数据库设计存储过程exp4-3
如下:
DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `exp4-3`(IN `stu_no` varchar(20))
BEGIN
SELECT Sno, Avg_grade FROM v_avg_s_g WHERE Sno=stu_no;
END
//
DELIMITER ;
调用:
SET @stu_no='1234567893';
CALL `exp4-3`(@stu_no);
结果:
五、实验小结
主要学习了使用create procedure语句创建存储过程,以及创建过程当中的一些需要注意的基本语法。MySQL和SQL Server的语法很相似,但是不太一样。比如在变量这方面,定义一个局部变量时变量名不一定必须包含@符号,但是定义一个用户变量的时候必须加上@符号,并且用户变量无需使用declare关键字事先声明;在创建存储过程时也没有AS、WITH等等关键字,调用时使用的是CALL关键字。
存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
存储过程的好处:
1、由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。
2、一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。
3、通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。