1.实验目的
(1)掌握存储过程和触发器的基本概念和功能。
(2)掌握创建、管理存储过程的方法。
(3)掌握创建、管理触发器的方法。
2.实验顶习与准备
(1)存储过程和触发器的基本概念。
(2)创建、管理存储过程的语法
(3)创建、管理触发器的语法
3.实验内容与步骤
?(1)?使用SQL创建存储过程,该存储过程接收两个参数分别是学生姓名和课程名称,根据这两个参数查询该生选修该课程的成绩,使用case语句根据成绩将其转换为等级,60分以下“不及格”,60-69为“及格”,70-79为“中等”,80-89为“良好”,90-100为“优秀”,没有成绩为“没有选修”,最后将该等级返回给调用者。
DELIMITER //
CREATE PROCEDURE GetGrade(IN student_name VARCHAR(50), IN course_name VARCHAR(50))
BEGIN
DECLARE student_id INT;
DECLARE course_id INT;
DECLARE student_grade DECIMAL(4,1);
DECLARE grade_level VARCHAR(20);
-- 获取学生ID
SELECT sno INTO student_id FROM score WHERE sno = student_name LIMIT 1;
-- 获取课程ID
SELECT cno INTO course_id FROM course WHERE cname = course_name LIMIT 1;
-- 查询学生选修该课程的成绩
SELECT score INTO student_grade FROM score WHERE sno = student_id AND cno = course_id;
-- 根据成绩转换为等级
CASE
WHEN student_grade IS NULL THEN SET grade_level = '没有选修';
WHEN student_grade < 60 THEN SET grade_level = '不及格';
WHEN student_grade BETWEEN 60 AND 69 THEN SET grade_level = '及格';
WHEN student_grade BETWEEN 70 AND 79 THEN SET grade_level = '中等';
WHEN student_grade BETWEEN 80 AND 89 THEN SET grade_level = '良好';
WHEN student_grade BETWEEN 90 AND 100 THEN SET grade_level = '优秀';
END CASE;
-- 返回等级给调用者
SELECT grade_level;
END //
DELIMITER ;
(2)?创建一个名为page_proc的存储过程,该存储过程接收两个参数分别为当前的页码数以及每页显示的最大记录数,根据这两个参数显示选课表上指定页的内容。
DELIMITER //
CREATE PROCEDURE page_proc(IN current_page INT, IN records_per_page INT)
BEGIN
DECLARE start_index INT;
DECLARE total_records INT;
DECLARE total_pages INT;
-- 计算起始索引
SET start_index = (current_page - 1) * records_per_page;
-- 获取总记录数
SELECT COUNT(*) INTO total_records FROM course_class;
-- 计算总页数
SET total_pages = CEIL(total_records / records_per_page);
-- 显示指定页的内容
SELECT *
FROM course_class
LIMIT start_index, records_per_page;
-- 返回总页数给调用者
SELECT total_pages;
END //
DELIMITER ;
??? (3)利用SQL语句创建一个触发器tr_credit,在对course表进行添加时,保证credit字段的值必须大于等于2并且小于8,否则不允许添加,并给出相应的错误提示(SIGNAL SQLSTATE '45000' set message_text = '学分错误';)。
创建后,执行如下插入语句,并观察结果:
INSERT INTO course(cno,cname, credit, hour,term,)
VALUES('c12345', 'operation', 1, 64,3);
DELIMITER //
CREATE TRIGGER tr_credit
BEFORE INSERT ON course
FOR EACH ROW
BEGIN
IF NEW.credit < 2 OR NEW.credit >= 8 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '学分错误';
END IF;
END //
DELIMITER ;