资源描述
______________________________________________________________________________________________________________
Oracle数据库应用开发综合设计实验
系统名称: 学生成绩管理系统
专 业: 计算机科学与技术
姓 名: 沈倩竹
班 级: 14计算机2班
学 号: 1430110311
指导教师: 王 岩
成 绩:
完成日期: 2016 年 6 月 17 日
1 系统分析
1.1 需求分析
学生成绩管理系统是高校不可缺少的一部分,对于学校教师而言,他们应该能够对系统的不同部分有各自不同的权限,对于学生而言,学生可以查询自己的成绩,对于管理员而言,系统应实现查询,记录学生成绩,对成绩进行各种操作的权限。本系统提供了学生成绩管理,课程信息管理,学生基本信息管理,教师基本信息管理,班级信息管理,以及系统的管理等功能。要求系统具备以下特点:
(1)操作简单、易用。
(2)数据存储可靠,具备较高的处理效率。
(3)系统安全、稳定。
(4)开发技术先进、功能完善、扩展性强。
1.2 功能分析
系统功能描述。
系统功能模块图如图1.1所示。
成绩信息查询
图1.1 系统功能模块图
1.2.1 成绩管理模块
本模块实现有关成绩基本信息的录入、修改、查询与删除。同时能够实现按照课程代码或者学生学号进行查询并且当登陆身份为学生时,只能查询自己的成绩,当身份为教师时,可以录入学生成绩和查询成绩的功能,但是不可以修改和删除学生成绩。
1.2.2 课程管理模块
对各专业课程信息进行添加、删除、修改同时能够实现按照课程编号、课程名称进行查询。并且当登陆用户身份为学生或者任课教师时,只能进行查询课程信息操作。
1.2.3 班级管理模块
对班级信息进行添加、删除和修改,并且当登陆用户身份是学生或这任课教师时,只能进行查询班级信息的操作。
1.2.4 学生管理模块
有关学生基本信息的录入、修改查询和删除。同时能够实现按照学生的学号、姓名等条件进行查询,并且登陆用户身份是学生或者任课教师时只能进行学生信息查询。
1.2.5 专业管理模块
有关专业基本信息的录入、修改查询和删除。同时能够实现按照专业代码或专业名称进行查询,并且登陆身份是学生或者任课教师时,只能进行查询操作。
1.2.6 教师管理模块
有关教师基本信息的录入、修改查询和删除。同时能够实现按照教师号、姓名等信息进行查询,并且登陆用户为学生时不能对此模块进行任何操作。
1.2.7 系统管理模块
有系统管理员身份的用户可以登陆,负责用户管理。对用户进行添加修改、查询和删除功能。
2 数据库设计
2.1概念结构设计
列出系统E-R图,包括局部E-R图和总E-R图。
系统E-R图如图2.1所示:
图2.1 学生成绩管理系统E-R图
学生基本信息实体图如图2.2所示:
图2.2 学生基本信息实体图
教师基本信息实体图如图2.3所示:
图2.3 教师基本信息实体图
课程基本信息实体图如图2.4所示:
图2.4 课程基本信息实体图
专业信息实体图如图2.5所示:
图2.5 专业信息实体图
班级信息实体图如图2.6所示:
图2.6班级信息实体图
用户类别信息实体图如图2.7所示:
图2.7用户类别信息实体图
用户信息实体图如图2.8所示:
图2.8用户信息实体图
成绩信息实体图如图2.9所示:
图2.9成绩信息实体图
2.2 逻辑结构设计
阐述什么是逻辑结构,需要做哪些工作。
1、学生实体集可以转换为关系:
Student(sno,sname,sex,classid,majorid), sno表示学生学号,sname表示学生姓名,sname表示学生性别,classid表示班级号,majid表示专业号。
2、教师实体集可以转换为关系:
Teacher(tno,tname,sex,majid),tno表示教师编号,tname表示教师姓名,sex表示教师性别,majid表示教师所在专业。
3、专业实体集可以转换为关系:
Major(majid,majname),majid表示专业号,majname表示专业名。
4、班级实体集可以转换为关系:
Class(classid,classname,majid),classid表示班级编号,classname表示班级名,majid表示班级所在专业。
5、课程实体集可以转换为关系:
Course(cno,cname,credit),cno表示课程编号,cname表示课程名,credit表示课程的学分。
6、成绩实体集可以转换为关系:
Grade(sno,sname,cno,cname,grade,credit,tno),sno表示学生学号,sname表示学生姓名,cno表示课程编号,cname表示课程名称,grade表示分数,credit表示学分,tno表示授课教师编号.
7、用户实体集可以转换为关系:
Users(userid,uname,pwd,typeid),userid表示登陆账号,uname表示用户名,pwd表示密码,typeid表示用户类别编号。
8、用户类别实体集可以转换为关系:
Usertype(typeid,typename),typeid表示类别号,typename表示类别名称。
2.3 物理结构设计
在数据库中创建名为studentspace的表空间,然后在表空间中根据关系模式创建表,其中表结构如下:
学生信息表,如表2.1所示。
表2.1 学生信息表(Student)
字段名
数据类型
长度
是否为空
名称
Sno
NUMBER
10
否
学号
Sname
VARCHAR2
4
否
学生姓名
Sex
CHAR
2
否
性别
Classid
NUMBER
10
否
班级号
Majorid
NUMBER
10
否
专业号
教师信息表,如表2.2所示。
表2.2 教师信息表(Teacher)
字段名
数据类型
长度
是否为空
名称
Tno
NUMBER
10
否
教师编号
Tname
VARCHAR2
4
否
教师姓名
Sex
CHAR
2
否
性别
Majorid
NUMBER
10
否
专业号
专业信息表,如表2.3所示。
表2.3 专业信息表(Major)
字段名
数据类型
长度
是否为空
名称
Majorid
NUMBER
10
否
专业号
Majorname
VARCHAR2
20
否
专业名
班级信息表,如表2.4所示。
表2.4 班级信息表(Class)
字段名
数据类型
长度
是否为空
名称
Classid
NUMBER
10
否
班级号
Classname
VARCHAR2
10
否
班级名
Majorid
NUMBER
10
否
所在专业
课程信息表,如表2.5所示。
表2.5 课程信息表(Course)
字段名
数据类型
长度
是否为空
名称
Cno
NUMBER
10
否
课程编号
Cname
VARCHAR2
10
否
课程名称
Credit
NUMBER
10
否
学分
成绩信息表,如表2.6所示。
表2.6 成绩信息表(Grade)
字段名
数据类型
长度
是否为空
名称
Sno
NUMBER
10
否
学号
Sname
VARCHAR2
10
否
学生姓名
Cno
NUMBER
10
否
课程编号
Cname
VARCHAR2
20
否
课程名称
Grade
NUMBER
3
否
成绩
Credit
NUMBER
3
否
学分
用户信息表,如表2.7所示。
表2.7 用户信息表(Users)
字段名
数据类型
长度
是否为空
名称
Userid
VARCHAR2
10
否
登陆账号
Uname
VARCHAR2
10
否
用户名
Pwd
VARCHAR2
20
否
密码
Typeid
NUMBER
10
否
用户类别
用户类别信息表,如表2.8所示。
表2.8 用户类别信息表(Type)
字段名
数据类型
长度
是否为空
名称
Typeid
NUMBER
10
否
类别编号
Typename
VARCHAR2
10
否
类别名称
3 表空间管理
3.1表空间分析与设计
通过需求分析,首先为学生成绩管理系统创建永久表空间studentspace,存储学生成绩管理系统的数据信息。
其次为学生成绩管理系统创建临时表空间studenttemp,存储学生成绩管理系统中排序或汇总过程中产生的临时数据。
最后为学生成绩管理系统创建撤销表空间studentundo,存储学生成绩管理系统中修改前的数据,如果用户需要对数据进行恢复,就会使用到撤销表空间中存储的撤销数据。
3.2创建表空间
3.2.1 永久表空间的创建
SQL> create tablespace studentspace
2 datafile 'E:\xuexi\oracle\shiyan\studentspace.dbf'
3 size 50m
4 autoextend on
5 next 5m
6 maxsize 100m;
3.2.2 临时表空间的创建
SQL> create temporary tablespace studenttemp
2 tempfile 'E:\xuexi\oracle\shiyan\studenttemp.dbf'
3 size 10m
4 autoextend on
5 next 2m
6 maxsize 20m;
3.2.3 撤销表空间的创建
SQL> create undo tablespace studentundo
2 datafile 'E:\xuexi\oracle\shiyan\studentundo.dbf'
3 size 50m
4 autoextend on
5 next 5m
6 maxsize 100m;
3.3修改表空间
3.3.1 通过数据字典dba_data_file查看studentspace表空间的数据文件信息
SQL> select tablespace_name,file_name,bytes
2 from dba_data_files
3 where tablespace_name='STUDENTSPACE';
TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------
BYTES
----------
STUDENTSPACE
E:\XUEXI\ORACLE\SHIYAN\STUDENTSPACE.DBF
52428800
3.3.2 修改studentspace表空间对应的数据文件的大小
SQL> alter database
2 datafile 'E:\XUEXI\ORACLE\SHIYAN\STUDENTSPACE.DBF'
3 resize 40m;
3.3.3 为studentspace表空间添加一个新的数据文件
SQL> alter tablespace studentspace
2 add datafile
3 'E:\XUEXI\ORACLE\SHIYAN\STUDENTSPACE1.DBF'
4 size 10m
5 autoextend on next 5m maxsize 40m;
3.3.4 删除新建的数据文件
SQL> alter tablespace studentspace
2 drop datafile 'E:\XUEXI\ORACLE\SHIYAN\STUDENTSPACE1.DBF';
4表的使用
4.1表的创建
4.1.1创建用户类别表,语句如下:
SQL> create table type(
2 typeid number(10) primary key,
3 typename varchar2(10) not null
4 )tablespace studentspace;
表已创建。
4.1.2创建用户信息表,语句如下:
SQL> create table users(
2 userid varchar2(10) primary key,
3 uname varchar2(10) not null,
4 pwd varchar2(20) not null,
5 typeid number(10) not null,
6 constraint users_type foreign key (typeid)
7 references type(typeid)
8 )tablespace studentspace;
表已创建。
4.1.3创建专业信息表,语句如下:
SQL> create table major(
2 majorid number(10) primary key,
3 majorname varchar(20) not null)
4 tablespace studentspace;
表已创建。
4.1.4创建班级信息表,语句如下:
SQL> create table class(
2 classid number(10) primary key,
3 classname varchar2(10) not null,
4 majorid number(10) not null,
5 constraint class_major foreign key(majorid)
6 references major(majorid)
7 )tablespace studentspace;
表已创建。
4.1.5创建学生信息表,语句如下:
SQL> create table student(
2 sno number(10) primary key,
3 sname varchar2(4) not null,
4 sex char(2) not null
5 check (sex in('男','女')),
6 classid number(10) not null,
7 majorid number(10) not null,
8 constraint student_class foreign key(classid)
9 references class(classid),
10 constraint student_major foreign key(majorid)
11 references major(majorid)
12 )tablespace studentspace;
表已创建。
4.1.6创建教师信息表,语句如下:
SQL> create table teacher(
2 tno number(10) primary key,
3 tname varchar2(4) not null,
4 sex char(2) not null
5 check (sex in('男','女')),
6 majorid number(10) not null,
7 constraint teacher_major foreign key(majorid) references major(majorid)
8 )tablespace studentspace;
表已创建。
4.1.7创建课程信息表,语句如下:
SQL> create table course(
2 cno number(10) primary key,
3 cname varchar(20) unique not null,
4 credit number(2) not null)tablespace studentspace;
表已创建。
4.1.8创建学生成绩表,语句如下:
SQL> create table grade(
2 sno number(10) primary key,
3 sname varchar2(10) not null,
4 cno number(10) not null,
5 cname varchar2(20) not null,
6 grade number(3) not null,
7 credit number(3) not null,
8 constraint grade_student foreign key(sno) references student(sno),
9 constraint grade_course foreign key(cno) references course(cno)
10 )tablespace studentspace;
表已创建。
4.2索引
4.2.1 在Class表中的classname列上创建classname_index的索引
SQL> create index classname_index
2 on class(classname)
3 tablespace studentspace;
4.2.2 打开Class表中class列上的classid_index索引的监控状态
SQL> alter index classname_index monitoring usage;
索引已更改。
通过数字字典v$object_usage可以查看哪些缩印正在被监控
SQL> column index_name format a15;
SQL> column table_name format a15;
SQL> select index_name,table_name,monitoring,
2 used,start_monitoring,end_monitoring
3 from v$object_usage;
INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING
--------------- --------------- --- --- ------------------- ----------------
CLASSNAME_INDEX CLASS YES NO 05/21/2016 11:00:43
4.3视图
4.3.1 创建基于class表和magor表的视图V1,在该视图的子查询中检索班级信息的同时显示其所在专业名称。
SQL> create view v1
2 as
3 select c.classid,c.classname,m.majorname
4 from class c left join major m
5 on c.majorid=m.majorid;
视图已创建。
5.2.2 创建基于grade表的视图V2,查询成绩不及格学生的信息
SQL> create view v2
2 as
3 select sno,sname,cname,grade from grade where grade<60;
视图已创建。
4.4使用序列
创建一个名为student_seq的序列
SQL> create sequence student_seq
2 start with 1
3 increment by 1
4 nocache
5 nocycle
6 order;
序列已创建。
5 查询
5.1 SQL语言基础
统计各专业女同学人数
SQL> select majorid,count(*) from student
2 where sex='女'
3 group by majorid
4 having count(*)>0
5 order by count(*) desc;
5.2 子查询与高级查询
5.2.1 查询平均成绩大于80分的同学的学号和平均成绩
SQL> select sno, avg(grade) from grade
2 group by sno
3 having avg(grade)>80;
5.2.2 查询“1”课程比“2”课程成绩高的所有学生的学号
SQL> select a.sno
2 from (select * from grade s where o = 1) a,
3 (select * from grade s where o = 2) b
4 where a.sno = b.sno
5 and a.grade > b.grade;
5.2.3 查询姓“刘”的学生名单
SQL> select * from student where sname like '刘%';
5.2.4 查询1门以上不及格课程的同学的学号及其平均成绩
SQL> select sno, avg(grade) from grade
2 group by sno having sno in(
3 select sno from grade
4 where grade<60
5 group by sno
6 having count(*) >1);
5.2.5 查询班级信息的同时显示其所在专业名称。
SQL> select c.classid,c.classname,m.majorname
2 from class c left join major m
3 on c.majorid=m.majorid;
5.2.6 查询每门课程被选修的学生数
SQL> select cno, count(*) rs,
2 (select cname from course
3 where cno=o)
4 cname from grade
5 group by cno;
5.2.7 查询所有学生的选课信息
SQL> select s.sno, s.sname studentname,
2 o, ame coursename
3 from student s, grade g, course c
4 where s.sno=g.sno and o=o;
6 PL/SQL语句
6.1 使用PL/SQL程序块,输出显示course表中的编号为1的课程名。
SQL> set serveroutput on;
SQL> declare
2 id constant number(10):=1;
3 name varchar2(30);
4 begin
5 select cname into name
6 from course where cno=id;
7 dbms_output.put_line(id||name);
8 end;
9 /
1oracle
PL/SQL 过程已成功完成。
6.2 在PL/SQL中,使用if条件语句判断成绩61分所处的等级。
SQL> declare
2 score binary_integer:=61;
3 begin
4 if score >=90 then
5 dbms_output.put_line('优秀');
6 elsif score>=80 then
7 dbms_output.put_line('良好');
8 elsif score>=70 then
9 dbms_output.put_line('中等');
10 elsif score>=60 then
11 dbms_output.put_line('及格');
12 else
13 dbms_output.put_line('不及格');
14 end if;
15 end;
16 /
及格
PL/SQL 过程已成功完成。
6.3 在PL/SQL中,查询所有学生的成绩是否有不及格,如有不及格就触发异常并输出。
SQL> declare
2 cursor c1 is select sname from grade where grade<60;
3 one grade.sname%type;
4 e1 exception;
5 begin
6 open c1;
7 fetch c1 into one;
8 if c1%found then raise e1;
9 end if;
10 exception
11 when e1 then
12 dbms_output.put_line(one||'不达标');
13 close c1;
14 end;
15 /
杨不达标
PL/SQL 过程已成功完成。
7 存储过程
7.1 创建一个存储过程update_student,该过程用来将student表中的编号为1的学生的姓名改为”一库”。
SQL> create procedure update_student
2 as
3 begin
4 update student set sname='一库' where sno =1;
5 end update_student;
6 /
过程已创建。
使用execute语句调用存储过程,如下:
SQL> execute update_student;
PL/SQL 过程已成功完成。
7.2 创建一个存储过程get_grade_information,采取直接在存储过程中使用DBMS_OUTPUT.PUT_LINE过程输出相关内容。
SQL> create or replace procedure get_grade_information
2 (s_no number)
3 as
4 s_name varchar2(10);
5 c_no number;
6 c_name varchar2(20);
7 s_grade number(3);
8 c_credit number(3);
9 begin
10 select sname,cno,cname,grade,credit
11 into s_name,c_no,c_name,s_grade,c_credit
12 from grade where sno=s_no;
13 DBMS_OUTPUT.PUT_LINE('学生姓名:'||s_name);
14 DBMS_OUTPUT.PUT_LINE('课程编号:'||c_no);
15 DBMS_OUTPUT.PUT_LINE('课程名称:'||c_name);
16 DBMS_OUTPUT.PUT_LINE('分数:'||s_grade);
17 DBMS_OUTPUT.PUT_LINE('学分:'||c_credit);
18 end get_grade_information;
19 /
过程已创建。
调用get_grade_information存储过程。例如获取sno为1401的学生的成绩信息,如下:
SQL> set serveroutput on
SQL> exec get_grade_information(1402);
学生姓名:杨
课程编号:2
课程名称:java
分数:40
学分:8
PL/SQL 过程已成功完成。
8 函数
8.1 创建一个函数get_sname,该函数实现按sno获取sname,函数创建如下:
SQL> create function get_sname(stu_num number)
2 return varchar2 as
3 stu_name student.sname%type;
4 begin
5 select sname into stu_name from student where sno=stu_num;
6 return stu_name;
7 end get_sname;
8 /
函数已创建。
因为函数是具有返回值的,所以它类似于一个表达式,调用函数可以直接使用select语句,如下:
SQL> select get_sname(1) from dual;
GET_SNAME(1)
-----------------------------------------------------------------
shen
9 触发器
9.1 创建INSERT触发器add_student_trigger,在向student表中添加数据时,该触发器将自动为student表的主键列sno赋值。
SQL> create trigger add_student_trigger
2 before insert
3 on student
4 for each row
5 begin
6 if :new.sno is null then
7 select student_seq.nextval into :new.sno from dual;
8 end if;
9 end add_student_trigger;
10 /
触发器已创建
触发器创建好后,在向student表中添加新记录时就可以不再关心主键列sno的赋值问题,例如使用如下语句向student表中添加学生信息:
SQL> insert into student(snumber,sname,sex,classid,majorid)
2 values(1506,'shen','女',1,1);
已创建 1 行。
SQL> commit;
提交完成。
查询student表中是否已经成功地添加了该学生信息:
SQL> select *from student where snumber=1506;
SNO SNAM SE CLASSID MAJORID SNUMBER
---------- ---- -- ---------- ---------- ----------
1 shen 女 1 1 1506
实验总结:
本次实验我在代码方面没遇到什么太大的困难,通过调试后都可以得出运行结果。
我认为实验的难点在于数据库的设计是否合理与查询等功能的设计是不是方便用户的需求,我们写的查询语句到底要用在这个系统的哪个功能上。还有就是一段代码我们是不是真的会了,真的理解了。离开书或者同种类型的题目去写,是否能独立写出一段代码。
Welcome To
Download !!!
欢迎您的下载,资料仅供参考!
精品资料
展开阅读全文