数据库原理_ 存储过程与触发器

七、存储过程与触发器

1、要求
1、执行存储过程时,实参数等于存储过程中形参数;实参数少于存储过程中形参数;
2、执行存储过程;通过对表操作触发激发触发器执行并查看结果。
实验环境:MySQL
实验步骤
1. 定义存储过程
① 创建一个能向学生表Student中插入一条记录的存储过程Insert_student,该存储过程需要五个参数,分别用来传递学号、姓名、班级号、性别、出生日期5个值。
插入一条记录的存储过程Insert_student:
在这里插入图片描述②执行存储过程Insert_student,向Student表中插入一个新记录,实参值由用户自己给出。
执行存储过程:
在这里插入图片描述③创建一个向课程表Course中插入一门新课程的存储过程Insert_course,该存储过程需要三个参数,分别用来传递课程号、课程名、学分,但允许参数“学分”的默认值为2,即当执行存储过程Insert_course时,未给第三个参数“学分”提供实参值时,存储过程按默认值2进行运算。
④执行存储过程Insert_course,向课程表Course中插入一门新课程,分两种情况:
第一种情况:提供三个实参值执行存储过程Insert_course,实参值由用户自己给出。
在这里插入图片描述第二种情况:只提供二个实参值执行存储过程Insert_course,即不提供与参数“学分”对应的实参值。
执行完毕后,查询两种执行存储过程的结果并比较差别。
因为mysql存储过程不支持默认参数操作,所以用在SQLSever下存储过程的建立和执行,由于之前没有安装SQLSever不能验证其正确性:

create procedure Insert_course(@Course_no char(5) ,@Course_name char(20),@Course_score int=2)
As
begin
INSERT INTO course
values(@Course_no,@Course_name,@Course_score);
end
exec Insert_course '30007','数学建模';
SELECT *
FROM course;

⑤创建一个名称为query_student的存储过程,该存储过程的功能是从数据表student中根据学号查询某一同学的姓名、班级号、性别、出生日期。
在这里插入图片描述⑥执行存储过程query_student,查询学号为“001101”的姓名、班级号、性别、出生日期。
在这里插入图片描述2. 定义触发器
①创建一个当向学生表Student中插入一条新记录时能自动列出全部同学信息的触发器Display_student。执行存储过程Insert_student,向学生表Student中插入一条新记录,看触发器Display_student是否被执行。
在mysql的trigger和function中不能出现select * from table;或select 字段1, 字段2, 字段3 from table;等等形式的查询,因为其会返回一个结果集;而这在mysql的trigger和function中是不可接受的,但是在存储过程中可以。
在这里插入图片描述在这里插入图片描述在这里插入图片描述②创建一个触发器delete_student,删除学生表Student中记录的同时删除选修表Choice中相应的选课记录。然后,在学生表Student中删除一条记录,查看选修表Choice中相应的选课记录是否被删除。
先给choice表中插入了学号为“991203”学生的选课记录,然后创建触发器、删除student表中“991203”的记录
在这里插入图片描述在这里插入图片描述在这里插入图片描述3.对学生-课程数据库,编写存储过程或触发器完成下列功能
(1)使用游标逐条浏览某个系的学生记录;
参考SQLSever,
参考链接: 参考
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述(2)统计任意一门课程的成绩分布情况,即按照各分数段统计人数;
先建立rank表,第一列phase为分数段,第二列number为人数。
再编写存储过程。
执行存储过程。
在这里插入图片描述(3)统计每个学生的平均成绩及排名;

在这里插入图片描述
(4)当修改学生表中学生学号时,保证选课表中的学号同时更新。
在这里插入图片描述操作技巧与注意事项:
1. Create Procedure语句和Create Trigger语句必须是批处理的第一个语句。
2. 数据库所有者具有默认的创建存储过程的权限,它可把该权限传递给其他的用户。
3. 表的所有者具有创建触发器的缺省权限,他不能把该权限传递给其他的用户。
4. 存储过程和触发器作为数据库的对象,其命名必须符合命名规则。
5. 只能在当前数据库中创建属于当前数据库的存储过程和触发器。
6. 一个触发器只能对应一个表。
7. 存储过程与BAT文件又有很大的差别,存储过程已经进行了预编译,而BAT文件仅仅是将一些命令集合在一起。
8. 在对象资源管理器中,不能直接删除触发器。删除触发器只能使用DROP TRIGGER语句。

猜你喜欢

转载自blog.csdn.net/qq_45915957/article/details/106397497