麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
558
2023-07-07
MySQL数据库的触发器和存储过程实例分析
一、实验目的
1、掌握某主流DBMS支持的SQL编程语言和编程规范,规范设计存储过程;2、能够理解不同类型触发器的作用和执行原理,验证触发器的有效性;3、培养学生的系统思维,提升解决复杂工程问题所需的编程能力。
二、实验要求
掌握某主流DBMS的SQL编程语言,在前面创建的数据库基础上,定义BEFORE(for)触发器和AFTER触发器;掌握数据库存储过程定义、存储过程运行,存储过程更名,存储过程删除,存储过程的参数传递。
温馨提示:以下内容均已经过测试,不过难免会有疏漏,但是代码实现大多数思路及实现经测验都是正确的。
三、实现内容及步骤
1、创建一个不带参数的简单存储过程
(1)创建存储过程sp_avggrade,实现查询每门课程学生的平均成绩的功能;
delimiter//CREATE PROCEDURE sp_avggrade()COMMENT '查询每门课程学生的平均成绩的功能'BEGINSELECT cno as 课程号,avg(grade)as 平均成绩FROM scGROUP BY cno;end//delimiter;登录后复制
(2)调用该存储过程,实现查询。
call sp_avggrade();登录后复制
2、创建一个带输入参数的存储过程
(1)创建存储过程sp_course_avggrade, 实现通过输入课程编号参数查询指定课程编号的课程平均成绩的功能;
delimiter//CREATE PROCEDURE sp_course_avggrade(IN c_no CHAR(2))COMMENT '通过输入课程编号参数查询指定课程编号的课程平均成绩的功能'BEGINSELECT cno,AVG(grade)FROM scWHERE cno=c_no;END//delimiter;登录后复制
(2)调用该存储过程,获取指定课程的平均成绩。
3、创建一个带输入输出参数的存储过程
(1)创建存储过程sp_sdept _student,实现根据用户输入的院系编号参数,查找该学院的学生人数,并以变量形式输出的功能;
delimiter//CREATE PROCEDURE sp_sdept_student2(IN _sdept CHAR(10),OUT num int)BEGINSELECT COUNT(sno) INTO numFROM studentWHERE _sdept = sdept;END//delimiter;登录后复制
(2)调用该存储过程,以返回变量的形式获取相应院系的学生人数。
SET @num=10;CALL sp_sdept_student2('计科',@num);SELECT @num AS '人数';登录后复制
4、触发器的创建与使用
(1)在学生表上创建触发器,实现学生表中删除学生记录时,成绩表中该学生成绩记录的级联删除;
delimiter//CREATE TRIGGER delete_stuBEFORE DELETEON studentFOR EACH ROWBEGINDELETEFROM scWHERE sc.sno=old.sno;END//delimiter;登录后复制
(2)在选课表上创建触发器,若录入的成绩大于100分,小于0分,则拒绝插入记录并显示;
delimiter//CREATE TRIGGER scgradeBEFORE INSERT ON scFOR EACH ROWBEGINIF new.grade>100 or new.grade < 0 THENSIGNAL SQLSTATE '45000'SET message_text='录入成绩不符合规定,拒绝插入';END IF;END//delimiter;登录后复制
(3)验证(1)、(2)中触发器
验证(1)
DELETEFROM studentWHERE sno='201513';登录后复制
验证(2)
INSERT INTO sc(sno,cno,grade)VALUES('2002720','1',200);登录后复制
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。