Oracle数据库操作与触发器实践

需积分: 9 2 下载量 166 浏览量 更新于2024-09-11 收藏 8KB DOCX 举报
"Oracle实验涉及了Oracle数据库的基础操作,包括SQL查询、表的约束定义以及行级触发器的创建。实验内容围绕三个表展开:学生基本信息、课程信息和学生成绩。" 在Oracle数据库管理中,熟悉SQL语言是至关重要的。问题一中,通过以下SQL语句可以查询年龄在20到30之间的学生人数: ```sql SELECT COUNT(年龄) FROM 学生基本信息 WHERE 年龄 >= 20 AND 年龄 <= 30; ``` 这个查询利用`COUNT()`函数统计满足条件的行数,`WHERE`子句用于筛选年龄在指定范围内的记录。 在数据库设计中,确保数据完整性和一致性是必要的。问题二展示了如何对表进行约束定义。首先,为学生基本信息表的学号字段添加主键约束: ```sql ALTER TABLE 学生基本信息 ADD CONSTRAINT student_学号_pk PRIMARY KEY (学号); ``` 接着,为性别字段添加检查约束,确保性别只能为'男'或'女': ```sql ALTER TABLE 学生基本信息 ADD CONSTRAINT student_sex_ck 性别 CHECK (sex IN ('男', '女')); ``` 最后,为学生成绩表的学号字段添加外键约束,关联到学生基本信息表: ```sql ALTER TABLE 学生成绩表 ADD CONSTRAINT student_学号_fk FOREIGN KEY (学号) REFERENCES 学生基本信息(学号); ``` 这确保了学生成绩表中的学号必须存在于学生基本信息表中。 问题三涉及到了行级触发器的创建。触发器是一种在特定数据库操作(如INSERT、UPDATE或DELETE)发生后自动执行的存储过程。在这里,我们需要创建一个行级触发器,当学生成绩表有新插入或更新的数据时,检查并记录不及格学生的信息到新的表"不及格学生"中: ```sql CREATE TABLE scott.不及格学生 ( 学号 VARCHAR(20), 姓名 VARCHAR(20), 专业 VARCHAR(20), 课程名称 VARCHAR(20), 分数 NUMBER(20) ); CREATE OR REPLACE TRIGGER tri_score AFTER INSERT OR UPDATE ON 学生成绩 FOR EACH ROW DECLARE CURSOR cursor_stu(p_stu_no VARCHAR2, p_cour_no VARCHAR2) IS SELECT student.学号, student.姓名, student.专业, course.课程名称, score.分数 FROM student, score, course WHERE student.学号 = score.学号 AND course.课程编号 = score.课程编号 AND score.学号 = p_stu_no AND score.课程编号 = p_cour_no; v_stu cursor_stu%ROWTYPE; BEGIN -- 检查并处理不及格学生 IF :NEW.分数 < 60 THEN OPEN cursor_stu(:NEW.学号, :NEW.课程编号); FETCH cursor_stu INTO v_stu; CLOSE cursor_stu; INSERT INTO scott.不及格学生 VALUES (v_stu.学号, v_stu.姓名, v_stu.专业, v_stu.课程名称, v_stu.分数); END IF; END; / ``` 这个触发器定义了一个游标`cursor_stu`,用于获取不及格学生的详细信息,并在触发器主体中检查新插入或更新的分数是否低于60分。如果不及格,则将这些信息插入到"不及格学生"表中。 通过这些实验,我们可以深入理解Oracle数据库的基础操作,包括数据查询、表的约束设定和触发器的使用,这些都是数据库管理和开发中不可或缺的技能。