首页 理论教育 空间数据库实验教程实验内容与要求

空间数据库实验教程实验内容与要求

时间:2023-08-29 理论教育 版权反馈
【摘要】:图9-1University数据库E-R图数据库逻辑结构设计。图9-2University关系数据模型模式图第四步,用户子模式设计。SGA_T表的创建与初始化SQL语句代码如下:图9-3初始化的SGA_T表在SC表上定义一个UPDATE触发器,当修改某个学生的某一门选修课程的成绩后,自动重新计算所有的平均成绩,并更新到SGA_T表中。

空间数据库实验教程实验内容与要求

设计一个大学教学信息管理应用数据库University。其中,一个教师属于一个系,一个系有多名教师,每个系都有自己的办公地点。每个教师可以讲授多门课程,每个学生属于一个系,可以选修多门课程。每门课程具有一定学分,并可能有先导课程。

(1)数据库概念结构设计。识别出教师(Teacher)、系(Department)、课程(Course)、学生(Student)四个实体。每个实体的属性和代码如下。

系Department:系的编号Dno,系的名称Dname,系所在的办公地址Daddress;主码为系的编号Dno。

学生Student:学生学号Sno,学生姓名Sname,学生性别Ssex,学生年龄Sage,学生所属系编号Dno;主码为学生学号Sno。

教师Teacher:教师编号Tno,教师姓名Tname,教师职称Ttitle;主码为教师编号Tno。

课程Course:课程编号Cno,课程名称Cname,先导课程编号Cpno,课程学分Ccredit;主码为课程编号Cno。

根据实际语义,分析实体之间的联系,确定实体之间一对一、一对多和多对多联系,绘制E-R图(图9-1)。

图9-1 University数据库E-R图

(2)数据库逻辑结构设计。按照数据库设计中概念结构向逻辑结构转换规则,根据所绘制E-R图,设计University数据库逻辑结构(列出所有关系,确定每个字段的类型、长度等信息,以表的形式列出,画出数据库模式图),并写出相关SQL语句。

第一步,写出University关系数据库模式。

(a)系的信息表Department(Dno,Dname,Daddress)。

(b)学生信息表Student(Sno,Sname,Ssex,Sage,Dno)。

(c)教师信息表Teacher(Tno,Tname,Ttitle,Dno)。

(d)课程信息表Course(Cno,Cname,Cpno,Ccredit)。

(e)学生选课表SC(Sno,Cno,Grade)。

(f)教师授课表TC(Tno,Cno,Site)。

第二步,结合选定的数据库管理系统(Oracle),列出每个关系中每个属性的类型、长度等信息(表9-1~表9-6)。

表9-1 Department关系属性表

表9-2 Student关系属性表

表9-3 Teacher关系属性表

表9-4 Course关系属性表

表9-5 SC关系属性表

表9-6 TC关系属性表

第三步,画出数据库模式图,如图9-2所示(采用Oracle Data Modeler绘制)。需要说明的是,在Oracle中,INT类型会被转换成NUMBER(38),VARCHAR类型会被转换成VARCHAR2,FLOAT也会转成NUMBER类型。

图9-2 University关系数据模型模式图

第四步,用户子模式设计。例如,设计计算机系学生信息视图CSS。这里没有需要设计的其他用户子模式,故可以直接进入下一步物理设计。

(3)数据库物理结构设计。数据库物理结构设计首先根据数据库逻辑结构自动转换生成,然后再根据实际应用需求,设计数据库的索引与存储结构。这里主要给出数据库结构的SQL语言实现,代码如Code_9_1所示:

(4)定义一个无参数存储过程decreasegrade,更新所有学生成绩,将其降低5%,并调用该存储过程。代码如下:

(5)定义一个带输入参数的存储过程increasegrade,将课程号为1的所有学生成绩提升5%,要求课程号作为存储过程参数输入,并调用该存储过程。代码如下:

(6)定义一个带有输入和输出参数的存储过程averagestudentgrade,计算一个学生的所有选修课程的平均成绩,要求将学号作为输入参数,计算结果——该生的所有选修课平均成绩作为输出参数;调用该存储过程,并输出计算结果。代码如下:

(7)定义一个带有输入自定义函数calculateaveragestudentgrade,计算一个学生的所有选修课程的平均成绩,要求将学号作为输入参数,返回该生的所有选修课平均成绩,调用函数,并输出计算结果。代码如下:

(8)定义一个存储过程,采用普通无参游标实现计算学校开设的所有课程的学分之和。代码如下:

(9)定义一个存储过程,采用REF CURSOR实现计算学校所有学生选修课程的成绩之和。代码如下:

(10)定义一个存储过程,采用带参数游标实现按照学号计算学生的平均成绩。代码如下:

(11)在University数据库中创建表SGA_T,记录每个学生的所有选修课程的平均成绩,其主要字段包括SNO、AVERAGEGRADE,其主码为Sno。SGA_T表的创建与初始化SQL语句代码如下(图9-3):

图9-3 初始化的SGA_T表(www.xing528.com)

(a)在SC表上定义一个UPDATE触发器,当修改某个学生的某一门选修课程的成绩后,自动重新计算所有的平均成绩,并更新到SGA_T表中。

第一步,对于触发器的创建可以采用界面进行操作,也可编写SQL语句进行操作。两者在本质上其实是一样的。这里采用界面操纵,如图9-4所示。在SC表节点上点击右键弹出菜单,选择“Trigger”,选择“Create...”,弹出如图9-5所示的触发器创建对话框。

图9-4 触发器创建菜单

图9-5 创建触发器对话框

第二步,填写如图9-5所示的相关参数后,生成如图9-6中所示的初始化代码:

图9-6 生成的触发器初始代码

第三步,在BEGIN和END之间编写处理代码,实现修改后自动更新SGA_T中的平均成绩数据。具体实现代码如下:

(b)在SC表上定义一个INSERT触发器,当添加某个学生的某一门选修课程的成绩时,自动重新计算所有学生的平均成绩,并更新到SGA_T表中。代码如下:

(c)在SC表上定义一个DELETE触发器,当删除某个学生的某一门选修课程的成绩时,自动重新计算所有学生平均成绩,并更新到SGA_T表中。代码如下:

d)删除上面三个触发器,并删除数据表SGA_T。代码如下:

(12)采用Java开发一个基于JDBC的数据库应用程序,实现以下功能:输出每个学生选修课程总成绩。

(a)基于IDEA构建Java工程。

在IDEA中新建工程,选择“Java”类型,设置“Project sDK”,如图9-7所示;然后选择工程模版,如图9-8所示;接着,输入工程名称和存放位置,如图9-9所示,最后生成如图9-10所示的“Hello World”工程。

图9-7 IDEA构建Java工程

图9-8 IDEA Java工程模板

图9-9 IDEA Java工程基本信息

图9-10 IDEA Java Hello World工程

(b)添加依赖的Jar包、ojdbc8.jar等。

点击“File->Project Structure->Libraries”,再点击“+”,添加ojdbc8.jar和其他相关的依赖Jar包(图9-11~图9-13)。

图9-11 IDEA Java工程添加依赖库

图9-12 IDEA Java工程添加JDBC下的依赖库

图9-13 IDEA Java工程添加ojdbc8.Jar

(c)编写Java程序。

采用Java语言,基于JDBC编写数据库应用程序,与其他程序的主要区别在于多了如何连接数据库。对于Oracle 12c,一般连接的是其中的一个PLUGGABLE数据库,例如默认的PDBORCL。如果是Oracle 12c之前的版本,则不存在可插拔数据库的问题。当不管是不是可插拔数据库,一般而言,通过JDBC连接Oracle数据库基本程序都是一样的,但是URL有三种格式。

格式一Oracle JDBC Thin using an SID:

jdbc:oracle:thin:@host:port:SID

例如:jdbc:oracle:thin:@localhost:1521:orcl

格式二Oracle JDBC Thin using a ServiceName:

jdbc:oracle:thin:@//host:port/service_name

例如:jdbc:oracle:thin:@//localhost:1521/pdborcl

格式三Oracle JDBC Thin using a TNSName:

jdbc:oracle:thin:@TNSName

例如:jdbc:oracle:thin:@TNS_ALIAS_NAME

在上面三种格式中,格式二是比较常用的。需要注意的是这里的格式,“@”后面有“//”,“port”后面“:”换成了“/”,这种格式是Oracle推荐的格式,因为对于集群来说,每个节点的SID是不一样的,但是SERVICE_NAME可以包含所有节点。下面是连接本书示例数据库University的代码:

获取连接之后,就可以构建语句,执行并获取查询结果。代码如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈