观前提示:本篇内容为mysql数据库实验,代码内容经测试过,可能一小部分有所疏漏,也有会不符合每个人实验的要求的地方,因此以下内容建议仅做思路参考。

一、实验目的

  • 1、掌握某主流dbms支持的sql编程语言和编程规范,规范设计存储过程;
  • 2、能够理解不同类型触发器的作用和执行原理,验证触发器的有效性;
  • 3、培养学生的系统思维,提升解决复杂工程问题所需的编程能力。

二、实验要求

掌握某主流dbms的sql编程语言,在前面创建的数据库基础上,定义before(for)触发器和after触发器;掌握数据库存储过程定义、存储过程运行,存储过程更名,存储过程删除,存储过程的参数传递。

温馨提示:以下内容均已经过测试,不过难免会有疏漏,但是代码实现大多数思路及实现经测验都是正确的。

三、实现内容及步骤

1、创建一个不带参数的简单存储过程

  • (1)创建存储过程sp_avggrade,实现查询每门课程学生的平均成绩的功能;
delimiter//
create procedure sp_avggrade()
comment '查询每门课程学生的平均成绩的功能'
begin
select cno as 课程号,avg(grade)as 平均成绩
from sc
group 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 '通过输入课程编号参数查询指定课程编号的课程平均成绩的功能'
begin
select cno,avg(grade)
from sc
where cno=c_no;
end//
delimiter;

(2)调用该存储过程,获取指定课程的平均成绩。

3、创建一个带输入输出参数的存储过程

(1)创建存储过程sp_sdept _student,实现根据用户输入的院系编号参数,查找该学院的学生人数,并以变量形式输出的功能;

delimiter//
create procedure sp_sdept_student2(in _sdept char(10),out num int)
begin
select count(sno) into num
from student
where _sdept = sdept;
end//
delimiter;

(2)调用该存储过程,以返回变量的形式获取相应院系的学生人数。

set @num=10;
call sp_sdept_student2('计科',@num);
select @num as '人数';

4、触发器的创建与使用

(1)在学生表上创建触发器,实现学生表中删除学生记录时,成绩表中该学生成绩记录的级联删除;

delimiter//
create trigger delete_stu
before delete
on student
for each row
begin
delete
from sc
where sc.sno=old.sno;
end//
delimiter;

(2)在选课表上创建触发器,若录入的成绩大于100分,小于0分,则拒绝插入记录并显示;

delimiter//
create trigger scgrade
before insert on sc
for each row
begin
if new.grade>100 or new.grade < 0 then
signal sqlstate '45000'
set message_text='录入成绩不符合规定,拒绝插入';
end if;
end//
delimiter;

(3)验证(1)、(2)中触发器

验证(1)

delete
from student
where sno='201513';

验证(2)

insert into sc(sno,cno,grade)
values('2002720','1',200);

四、实验总结

  • 1、通过本次实验,对存储过程和触发器有了更深的认识;
  • 2、能够理解不同类型触发器的作用和执行原理, 验证了触发器的有效性;
  • 3、熟练掌握了数据库存储过程定义、存储过程运行,存储过程更名,存储过程删除,存储过程的参数传递。

到此这篇关于mysql数据库实验之 触发器和存储过程的文章就介绍到这了,更多相关mysq存储过程内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!