无偿分享一些之前做的实验报告~喜欢点赞+关注(*^_^*)
这个报告只是数据库的设计,没有前后端的其他知识,有需要可以参考
- 实验目的
掌握Oracle数据库的对象的创建和管理方法,巩固对Oracle数据库基本原理和基础理论的理解。掌握开发Oracle数据库应用程序的技术,巩固对Oracle数据库基本原理和基础理论的理解。
- 设备与环境
硬件:多媒体计算机
软件:Windows,Oracle 12c 数据库管理系统
- 实验内容
1系统概述
1.1系统功能介绍
教务系统管理数据库是针对学校教务管理方面设计的一个数据库,主要目的是在选课事项上达到学生、课程和教师的统一,实现更清晰的插入与查询。
1.2功能模块划分
- 学生信息管理模块:负责处理学生信息的相关操作。系统可以录入、更新和检索学生的基本信息,包括学号、姓名、性别、年龄等。
- 教师信息管理模块:负责处理教师信息的相关操作。
- 课程管理模块:负责课程设置和维护的相关操作。系统可以添加课程,设定课时,学分,课程号,课程名等。
- 成绩管理模块:负责学生成绩录入、更新和查询的相关操作。可以录入和更新成绩,也可以查询成绩。
- 其他模块:各类其他数据库对象使用查询筛选排序。可以以时间为顺序,整理出课程表。还可以查询每个课程的所有信息。
1.3开发语言
Oracle12c教务管理系统数据库的开发语言主要是PL/SQL,这是一种Oracle公司特有的过程式编程语言,主要用于数据库的存储过程、触发器和函数等对象的编写。
1.4开发工具
选择使用Oracle的SQL Developer。这是一个为数据库管理员和开发人员设计的图形化用户界面,提供了一个强大的环境来创建、查询、调试和管理Oracle数据库。
2设计应用系统数据库
2.1系统ER图
图 2-1:ER图
2.2数据库逻辑设计
实体:
- 学生(学号,姓名,性别,年龄)
- 课程(课程号,课程名,课时,学分)
- 教师(编号,姓名,性别,职称,年龄)
联系:
- 选课(学号,课程号,考核成绩)
- 任课(课程号,编号,任课时间,使用教材)
2.3数据库实现
2.3.1 数据库表结构
将所有关系模式的表结构列出,如下
- 表名:学生表
字段名 | 数据类型 | 是否主、外键 | 约束条件 | 含义 |
学号 | Char(10) | 是主键 | 唯一约束 | 学生的学号 |
姓名 | VarChar(30) | 否 | 非空约束 | 学生的名字 |
性别 | Char(4) | 否 | 男或者女 | 学生的性别 |
年龄 | Int | 否 | 大于0 | 学生的年龄 |
- 表名:课程表
字段名 | 数据类型 | 是否主、外键 | 约束条件 | 含义 |
课程号 | Char(10) | 是主键 | 唯一约束 | 课程号 |
课程名 | VarChar(30) | 否 | 非空约束 | 课程名 |
课时 | Int | 否 | 大于0 | 课时 |
学分 | Int | 否 | 大于0 | 学分 |
- 表名:教师表
字段名 | 数据类型 | 是否主、外键 | 约束条件 | 含义 |
编号 | Char(10) | 是主键 | 唯一约束 | 编号 |
姓名 | VarChar(30) | 否 | 非空约束 | 姓名 |
性别 | Char(4) | 否 | 男或者女 | 性别 |
年龄 | Int | 否 | 大于0 | 年龄 |
职称 | VarChar(30) | 否 | 无 | 职称 |
- 表名:选课表
字段名 | 数据类型 | 是否主、外键 | 约束条件 | 含义 |
学号 | Char(10) | 是主键、外键 | 外键约束 | 学生的学号 |
课程号 | Char(10) | 是主键、外键 | 外键约束 | 课程号 |
考核成绩 | Decimal(10,2) | 否 | 无 | 考核成绩 |
- 表名:任课表
字段名 | 数据类型 | 是否主、外键 | 约束条件 | 含义 |
编号 | Char(10) | 是外键 | 外键约束 | 编号 |
课程号 | Char(10) | 是主键、外键 | 外键约束 | 课程号 |
任课时间 | Date | 否 | 无 | 任课时间 |
使用教材 | VarChar(30) | 否 | 无 | 使用教材 |
2.3.2 在ORACLE中创建数据表和其他数据对象
写出所有表的sql语句,经过勘误,以下代码成功执行。
(1) 表空间及用户创建语句:
创建一个名为ora1的表空间和CWJ的用户,并授权给CWJ所有权限:
create tablespace ora1
datafile 'd:/ora1.ora'
size 100m
autoextend on;
create user c
identified by 123456
default tablespace ora1
temporary tablespace temp;
grant all privileges to c;
图 3-1:成功截图
(2) 各个数据表创建语句:
create table C.学生表(
学号 char(10) primary key,
姓名 varchar(30) not null,
性别 char(4) check(性别 in('男','女')),
年龄 int check(年龄>0)
)
tablespace ora1;
create table C.课程表(
课程号 char(10) primary key,
课程名 varchar(30) not null,
课时 int check(课时>0),
学分 int check(学分>0)
)
tablespace ora1;
create table C.教师表(
编号 char(10) primary key,
姓名 varchar(30) not null,
性别 char(4) check(性别 in('男','女')),
年龄 int check(年龄>0),
职称 varchar(30)
)
tablespace ora1;
create table C.选课表(
学号 char(10),
课程号 char(10),
考核成绩 decimal(10, 2),
primary key(学号,课程号),
foreign key (学号) references C.学生表(学号),
foreign key (课程号) references C.课程表(课程号)
)tablespace ora1;
create table C.任课表(
编号 char(10),
课程号 char(10) primary key,
任课时间 date,
使用教材 varchar(30),
foreign key (编号) references C.教师表(编号),
foreign key (课程号) references C.课程表(课程号)
)tablespace ora1;
图 3-2 建表成功截图
(3) 插入数据:
使用sql developer页面插入,或使用sql语句。
图 3-3学生表
图 3-4教师表
图 3-5课程表
图 3-6选课表
图 3-7任课表
(4) 创建数据库对象:
索引:在选课表的成绩列创建一个降序索引
create index C.ind1 on C.选课表(考核成绩 desc)
tablespace ora1;
图 4-1
视图:创建视图,显示每个课程的任课教师,时间,教材以及上课学生数量等:
create view C.inf1 as
select
C.课程表.课程号,
C.课程表.课程名,
C.任课表.编号,
C.任课表.任课时间,
C.任课表.使用教材,
count(distinct C.选课表.学号) AS 学生数量,
avg(C.选课表.考核成绩) AS 平均成绩
from C.课程表,C.任课表,C.选课表
where C.课程表.课程号=C.任课表.课程号 and
C.课程表.课程号=C.选课表.课程号
group by
C.课程表.课程号,
C.课程表.课程名,
C.任课表.编号,
C.任课表.任课时间,
C.任课表.使用教材;
图 4-2
存储过程:创建一个存储过程,输入学号,可以查询到自己名下课程的平均成绩,并列出单科最高分:
create or replace procedure C.get1
(id in C.学生表.学号%type,av out number,ma out number
)
as
begin
select avg(考核成绩),max(考核成绩) into av,ma from C.学生表
join C.选课表 on C.学生表.学号=C.选课表.学号;
end get1;
图 4-3
调用语句测试:
set serveroutput on;
declare
a number(10,2);
b number(10,2);
begin
C.get1(102,a,b);
dbms_output.put_line('平均分:'||a||' 最高分:'||b);
end;
图 4-4
- 实验结果及分析
(1) 索引情况:选课表成绩列降序索引
图 5-1
(2) 存储过程调用查询情况:
图5-2 查询学号101
图 5-3 查询学号102
(3) 视图情况:显示每个课程的情况并计算平均成绩
图 5-4 视图
(4) 实验总结:
通过对教务管理系统设计的Oracle综合实验,从关系模式,关系表,建表,添加数据,创建各类数据对象来分析数据这一系列的实验活动,我发现每一个步骤都是必不可少的,让数据库的建立充满逻辑。
在这个过程中,我觉得最重要的是清晰的思路和细心的做法,在此过程中,我更加熟悉对于sql语句的书写和使用,熟练掌握了Oracle SQL Developer的使用,包括创建表空间用户,创建数据表,通过查询完成各项数据库使用……我掌握了Oracle数据库的多种建立方法。这对于在实验过程中遇到问题很有帮助,可以换种思路解决。
另外,我也学会了快速地通过Developer的错误分析找到我书写的sql语句中的漏洞,最终初具规模地完成了教务管理系统数据库的制作,并能够建立视图、索引以及存储过程来分析数据库中的数据,融会贯通了本学期学习的Oracle数据库的各种相关知识,我觉得非常有成就感。
当然,这个实验还有很多地方值得完善,比如说数据库的表用户并没有排上大用场,觉得可以往这方面实现一下,以及因为时间关系,没有做一个前端页面,使得数据库能灵活运用起来。还有我觉得可以使用视图索引存储过程制作出更复杂更有用的数据分析表,教务系统对于我们来说比较熟悉,应该思考如何能让更贴合实际的数据库落实……这些都是值得我们去深入讨论和掌握的。
(5) 报错记录与分析:
图 5-5 报错1
经过检查发现,int类型不能写上长度,去掉之后顺利建表。
图 5-6 报错2
经检查发现,忘记改名,不重名表才能建立。
图 5-7 报错3
经过搜索资料和对比发现,建立外键时,联系不应该写C.课程表.课程号,而是应该写C.课程表(课程号),将字段名写到括号里,报错消失。
图 5-8 报错4
在插入数据的时候无法保存,发现是教师表中的编号重复了,违反了约束条件。
图 5-9 报错5
经过查教材86页的创建索引语法规则,发现把desc误写到括号外面,引发错误。
图 5-10 报错6
百度查询报错原因,发现是因为group后面应该跟上select的所有字段。
图 5-11 报错7
第一错在打错字应该是output,第二错在不明白去哪里看结果,加上一句set serveroutput on;还有一个是小数位数太长,限制了一下number到两位数。
图 5-12 报错8
测试的时候发现调用存储过程计算出来的平均分不是这位同学的真实分数,而变成所有同学的成绩,发现代码写错了,漏了条件与in参数对照。想要加入中文的时候,发现必须要单引号而且要小心不要打成中文字符了。