--1、class表 create table mr_class( clno varchar(5) primary key, dept varchar2(40) not null, grade varchar(8) not null, branch varchar2(20) not null ); --2、student表 create table mr_student( sno varchar2(5) primary key, name varchar2(12) not null, age number(2) not null, sex char(1) not null, entrance date, address varchar2(100), clno varchar2(5), constraint mr_clno foreign key(clno) references mr_class(clno) ); --3、course表 create table mr_course( cno varchar2(5) primary key, name varchar2(60) not null, score number(2) not null ); --4、teacher 表 create table mr_teacher( tno varchar2(5) primary key, name varchar2(12) not null, age number(2), cno varchar2(5) not null ); --5、学生选课表st create table mr_st( sno varchar2(5) not null, tno varchar2(5) not null, grade number(2) default 0 );用以上五个表建两个函数、一个触发器、两个存储过程
时间: 2024-03-17 10:43:21 浏览: 63
下面是基于以上五个表的两个函数、一个触发器和两个存储过程的示例:
1. 函数1:查询某个班级的学生人数
```sql
CREATE OR REPLACE FUNCTION get_student_count_by_clno(p_clno IN VARCHAR2)
RETURN NUMBER
IS
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count
FROM mr_student
WHERE clno = p_clno;
RETURN v_count;
END;
```
该函数接受一个班级编号作为参数,并返回该班级的学生人数。
2. 函数2:计算某个学生的平均成绩
```sql
CREATE OR REPLACE FUNCTION get_avg_score_by_sno(p_sno IN VARCHAR2)
RETURN NUMBER
IS
v_avg_score NUMBER;
BEGIN
SELECT AVG(grade) INTO v_avg_score
FROM mr_st
WHERE sno = p_sno;
RETURN v_avg_score;
END;
```
该函数接受一个学生编号作为参数,并返回该学生的平均成绩。
3. 触发器:在学生表上插入记录时自动计算年龄
```sql
CREATE OR REPLACE TRIGGER calc_age
BEFORE INSERT ON mr_student
FOR EACH ROW
BEGIN
:NEW.age := TRUNC(MONTHS_BETWEEN(SYSDATE, :NEW.entrance) / 12);
END;
```
该触发器在每次插入学生表时自动计算该学生的年龄,并将结果存储到 age 字段中。
4. 存储过程1:查询某个教师所教授的课程和成绩
```sql
CREATE OR REPLACE PROCEDURE get_course_and_grade_by_tno(p_tno IN VARCHAR2)
IS
BEGIN
SELECT c.name, s.grade
FROM mr_course c
JOIN mr_st s ON c.cno = s.cno
WHERE s.tno = p_tno;
END;
```
该存储过程接受一个教师编号作为参数,并返回该教师所教授的课程和成绩。
5. 存储过程2:更新某个学生的成绩
```sql
CREATE OR REPLACE PROCEDURE update_grade_by_sno(p_sno IN VARCHAR2, p_cno IN VARCHAR2, p_grade IN NUMBER)
IS
BEGIN
UPDATE mr_st
SET grade = p_grade
WHERE sno = p_sno AND cno = p_cno;
END;
```
该存储过程接受一个学生编号、一个课程编号和一个成绩作为参数,并将该学生在该课程中的成绩更新为指定值。
阅读全文