某中学排课系统数据库全部系统功能设计与实现(触发器、存储过程、函数)及其相应代码
时间: 2023-12-24 09:04:58 浏览: 90
数据库课程设计---某中学的排课管理系统的设计
5星 · 资源好评率100%
下面是某中学排课系统数据库全部系统功能设计与实现(触发器、存储过程、函数)及其相应代码的示例。
1. 触发器
(1)当教师信息被修改时,更新课程表中的教师信息。
```sql
CREATE TRIGGER update_teacher_info
AFTER UPDATE ON teacher
FOR EACH ROW
BEGIN
UPDATE schedule SET teacher_id = NEW.teacher_id WHERE teacher_id = OLD.teacher_id;
END;
```
该触发器在教师表中的记录被修改之后触发,将课程表中与该教师相关的记录的教师信息更新为修改后的教师信息。
(2)当学生选课信息被修改时,更新课程表中的选课信息。
```sql
CREATE TRIGGER update_course_selection
AFTER UPDATE ON student_course
FOR EACH ROW
BEGIN
UPDATE schedule SET selected_num = selected_num + (NEW.selected - OLD.selected) WHERE class_id = NEW.class_id AND course_id = NEW.course_id AND day = NEW.day AND period = NEW.period;
END;
```
该触发器在学生选课信息表中的记录被修改之后触发,将课程表中与该选课信息相关的记录的选课信息更新为修改后的选课信息。
2. 存储过程
(1)实现自动排课功能。
```sql
CREATE PROCEDURE generate_course_schedule()
BEGIN
-- 删除原有的课程表
DELETE FROM schedule;
-- 为每个班级生成课程表
FOR i IN 1..(SELECT COUNT(*) FROM class)
LOOP
-- 获取当前班级信息
SELECT class_id, teacher_id, course_id FROM student_course WHERE class_id = i INTO @class_id, @teacher_id, @course_id;
-- 生成周一到周五的课程表
FOR j IN 1..5
LOOP
-- 生成第 1 节到第 8 节的课程表
FOR k IN 1..8
LOOP
-- 判断当前时间段是否有课程
IF EXISTS (SELECT * FROM student_course WHERE class_id = @class_id AND course_id = @course_id AND day = j AND period = k AND selected > 0)
THEN
-- 插入课程表记录
INSERT INTO schedule (class_id, teacher_id, course_id, day, period, selected_num) VALUES (@class_id, @teacher_id, @course_id, j, k, (SELECT selected FROM student_course WHERE class_id = @class_id AND course_id = @course_id AND day = j AND period = k));
END IF;
END LOOP;
END LOOP;
END LOOP;
END;
```
该存储过程实现了自动为每个班级生成课程表的功能。具体实现过程为:先删除原有的课程表,然后按照学生选课信息和教师排课信息,生成每个班级周一到周五的课程表。
(2)实现课程成绩自动计算功能。
```sql
CREATE PROCEDURE calculate_course_score()
BEGIN
-- 删除原有的成绩表
DELETE FROM course_score;
-- 计算每个学生每门课程的成绩
FOR i IN 1..(SELECT COUNT(*) FROM student)
LOOP
-- 获取当前学生 ID
SELECT student_id FROM student WHERE student_no = i INTO @student_id;
-- 计算该学生每门课程的成绩
FOR j IN 1..(SELECT COUNT(*) FROM student_course WHERE student_id = @student_id)
LOOP
-- 获取当前选课信息
SELECT class_id, course_id, score FROM student_course WHERE student_id = @student_id LIMIT j-1, 1 INTO @class_id, @course_id, @score;
-- 计算该课程的平均成绩
SELECT AVG(score) INTO @avg_score FROM student_course WHERE class_id = @class_id AND course_id = @course_id AND score > 0;
-- 插入成绩表记录
INSERT INTO course_score (student_id, class_id, course_id, score) VALUES (@student_id, @class_id, @course_id, @avg_score);
END LOOP;
END LOOP;
END;
```
该存储过程实现了自动计算每个学生每门课程成绩的功能。具体实现过程为:先删除原有的成绩表,然后按照学生选课信息,计算每个学生每门课程的平均成绩,并将结果保存到成绩表中。
3. 函数
(1)计算每个学生的平均分。
```sql
CREATE FUNCTION calculate_student_avg_score(student_id INT) RETURNS DECIMAL(5,2)
BEGIN
DECLARE avg_score DECIMAL(5,2);
-- 计算该学生所有课程的平均分
SELECT AVG(score) INTO avg_score FROM course_score WHERE student_id = student_id;
RETURN avg_score;
END;
```
该函数用于计算指定学生的所有课程的平均分。具体实现过程为:按照学生 ID,查询成绩表中该学生所有课程的成绩,并计算平均分。
(2)计算每个班级的平均分。
```sql
CREATE FUNCTION calculate_class_avg_score(class_id INT) RETURNS DECIMAL(5,2)
BEGIN
DECLARE avg_score DECIMAL(5,2);
-- 计算该班级所有学生的平均分
SELECT AVG(score) INTO avg_score FROM course_score WHERE class_id = class_id;
RETURN avg_score;
END;
```
该函数用于计算指定班级的所有学生的平均分。具体实现过程为:按照班级 ID,查询成绩表中该班级所有学生的课程成绩,并计算平均分。
阅读全文