oracle三级项目.docx
《oracle三级项目.docx》由会员分享,可在线阅读,更多相关《oracle三级项目.docx(29页珍藏版)》请在冰豆网上搜索。
oracle三级项目
项目名称:
图书管理系统的设计与实现
1.需求描述
1.1背景
图书馆在正常运营中面对大量书籍、读者信息以及两者间相互联系产生的借书信息、还书信息。
现有的人工记录方法既效率低又错误过多,大大影响了图书馆的正常管理工作。
因此需要对书籍资源、读者资源、借书信息、还书信息进行管理,及时了解各个环节中信息的变更,有利于管理效率的提高。
1.2功能分析图
1.3数据流程图
2.概念结构设计
2.1分E-R图
(管理员E-R图)
(学生E-R图)
(图书E-R图)
2.2总E-R图
(总E-R图)
设计说明:
上图是该图书管理系统总E-R图,该系统涉及的实体集有:
学生实体集:
具有属性用户名、密码、学号,姓名,性别,院系、班级、电话
图书实体集:
具有属性图书ISBN编号、图书书名、作者、出版社、定价、图书类别、库存
管理员实体集:
具有属性用户名、密码、姓名、加入时间
一个学生可以借阅和归还多本图书,所以学生和图书之间的联系为1:
n的联系。
一个管理员可以对多本图书进行管理,图书管理员可以有多个,所以管理员和图书之间的联系为m:
n的联系。
一个管理员可以对多个读者进行管理,图书管理员可以有多个,所以管理员和学生之间的联系为m:
n的联系。
3.逻辑结构设计
(1)表的设计
1.管理员体集可以转换为关系:
ADMINISTRATOR(ADMIN_ID,ADMIN_NAME,PASSWORD,TELEPHONE,EMAIL,ADDRESS)
ADMIN_ID表示管理员用户ID,ADMIN_NAME表示姓名,PASSWORD表示密码,TELEPHONE表示管理员电话,EMAIL表示管理员邮箱地址,ADDRESS表示联系地址
2.图书详细信息可以转换为关系
BOOK_DETAILS(BOOK_ID2,BOOK_NAME,KIND_ID,WRITER,PUBLISHER_ID,INTRODUCTION,PUBLISH_DATE,IN_DATE,ACCOUNT)
BOOK_ID2表示书号,BOOK_NAME表示书名,KIND_ID表示借阅量,WRITER表示最大借阅量,PUBLISHER_ID出版社号,INTRODUCTION表示读者名,PUBLISH_DATE表示借出日期,IN_DATE表示归还日期,ACCOUNT表示书的状态
3.图书管理记录可以转换为关系
BOOK_MANAGE_RECORDS(ADMIN_ID,BOOK_ID,ACTION,TIME)
ADMIN_ID表示管理员号,BOOK_ID表示图书号,ACTION表示开始状态,TIME表示借阅时间
4.图书分类可以转换为关系
BOOKKINDS(KIND_ID,KIND_NAME,FATHER_TYPE,)
KIND_ID表示索书号,KIND_NAME表示索书名,FATHER_TYPE表示上次借书记录
5.出版社实体可以转化的关系
PUBLISHER("PUBLISHER_ID","TELEPHONE","FAX","EMAIL","ADDRESS","PUBLISHER_NAME")"PUBLISHER_ID"出版社ID"TELEPHONE"电话"FAX"传真"EMAIL"邮箱"ADDRESS"地址"PUBLISHER_NAME"出版社名字
6.读者实体可以转化为
READERS("READER_ID","READER_NAME","PASSWORD","TELEPHONE","EMAIL","COMPANY","SEX","IN_DATE")
"READER_ID"读者号"READER_NAME"读者名称"PASSWORD"密码"TELEPHONE"电话"EMAIL"邮箱"COMPANY"公司"SEX"性别"IN_DATE"日期
7.图书预约转化表为
RESERVATIONS("READER_ID","BOOK_ID2","R_DATE")"READER_ID"读者ID"BOOK_ID2"书ID"R_DATE"日期
8.图书实体转化为
BOOKS("BOOK_ID","BOOK_ID2","STATE",)"BOOK_ID",书号"BOOK_ID2",检索书号"STATE",书的状态
9.借阅记录
BORROW_RECORDS("BOOK_ID",,"READER_ID","BORROW_DATE","RETURN_DATE","STATE","RENEWABLE",)
"BOOK_ID",书号"READER_ID",读者号"BORROW_DATE",借书日期"RETURN_DATE",还书日期"STATE",书的状态"RENEWABLE",续订
10.图书荐购
BUY_RECOMMENDATION("RECOMMENDATION_ID","READER_ID","BOOK_NAME","WRITER","PUBLISHER_NAME","SUMMARY",)"RECOMMENDATION_ID",荐购号"READER_ID",读者号"BOOK_NAME",书名"WRITER",作者"PUBLISHER_NAME",出版社名"SUMMARY",总价
(2)序列的设计
创建一个名为“TUSER_SEQ”的序列,用于产生读者学号,起始值为307,步长为1,不缓存,不循环。
创建一个名为“TBOOK_SEQ”的序列,用于产生部门编号,起始值为380,步长为10,最大值为9990,不缓存,不循环.
创建一个seq_Borrow,用于产生读者编号,起始值为1,步长为1,不缓存,不循环。
(3)视图的设计
读者当前借阅
新进书目
图书推荐
图书视图
(4)索引的设计
在图书表上创建唯一性索引
在读者表表上的sex列上创建一个位图索引
4.数据库实施
(1)创建用户,并给用户授权
insertinto"WIN2008"."ADMINISTRATOR"
values('070411','admin','admin','123456789','121212@com',’大连’);
(2)创建表
1.管理员表
ADMINISTRATOR
("ADMIN_ID"CHAR(10)NOTNULLENABLE,
"ADMIN_NAME"CHAR(50)NOTNULLENABLE,
"PASSWORD"VARCHAR2(20)NOTNULLENABLE,
"TELEPHONE"NUMBER,
"EMAIL"VARCHAR2(50),
"ADDRESS"VARCHAR2(100),
CONSTRAINT"PRIMARY_ADMIN_ID"PRIMARYKEY("ADMIN_ID")
2.读者表
READERS
("READER_ID"CHAR(10)NOTNULLENABLE,
"READER_NAME"VARCHAR2(50)NOTNULLENABLE,
"PASSWORD"VARCHAR2(20)NOTNULLENABLE,
"TELEPHONE"CHAR(13),
"EMAIL"VARCHAR2(50),
"COMPANY"VARCHAR2(50),
"SEX"CHAR(3)NOTNULLENABLE,
"IN_DATE"DATE,
CONSTRAINT"PRIMARY_READER_ID"PRIMARYKEY("READER_ID")
3.借阅记录表
BORROW_RECORDS
("BOOK_ID"CHAR(10)DEFAULT1NOTNULLENABLE,
"READER_ID"CHAR(10)NOTNULLENABLE,
"BORROW_DATE"DATENOTNULLENABLE,
"RETURN_DATE"DATENOTNULLENABLE,
"STATE"CHAR
(1)DEFAULT1NOTNULLENABLE,
"RENEWABLE"CHAR
(1)DEFAULT1NOTNULLENABLE,
CONSTRAINT"PRIMARY_RECORD_ID"PRIMARYKEY("BOOK_ID","READER_ID","BORROW_DATE")
4.图书预约表
RESERVATIONS
("READER_ID"CHAR(10)NOTNULLENABLE,
"BOOK_ID2"CHAR(10)NOTNULLENABLE,
"R_DATE"DATENOTNULLENABLE,
CONSTRAINT"PRIMARY_KEY_1"PRIMARYKEY("READER_ID","BOOK_ID2","R_DATE")
5.图书荐购表
BUY_RECOMMENDATION
("RECOMMENDATION_ID"CHAR(10)NOTNULLENABLE,
"READER_ID"CHAR(10)NOTNULLENABLE,
"BOOK_NAME"VARCHAR2(50)NOTNULLENABLE,
"WRITER"VARCHAR2(50),
"PUBLISHER_NAME"VARCHAR2(100),
"SUMMARY"VARCHAR2(1000),
CONSTRAINT"PRIMARY_REC_ID"PRIMARYKEY("RECOMMENDATION_ID")
6.图书表
BOOKS
("BOOK_ID"CHAR(10)NOTNULLENABLE,
"BOOK_ID2"CHAR(10)NOTNULLENABLE,
"STATE"CHAR
(1)NOTNULLENABLE,
CONSTRAINT"PRIMARY_KEY"PRIMARYKEY("BOOK_ID")
7.图书管理记录表
BOOK_MANAGE_RECORDS
("ADMIN_ID"CHAR(10)NOTNULLENABLE,
"BOOK_ID"CHAR(10)NOTNULLENABLE,
"ACTION"VARCHAR2(50)NOTNULLENABLE,
"TIME"DATENOTNULLENABLE,
CONSTRAINT"PRIMARY_BOOK_MANAGE_RECORDS"PRIMARYKEY("ADMIN_ID","BOOK_ID","TIME")
8.图书详细信息表
BOOK_DETAILS
("BOOK_ID2"CHAR(10)NOTNULLENABLE,
"BOOK_NAME"VARCHAR2(50)NOTNULLENABLE,
"KIND_ID"CHAR(10)NOTNULLENABLE,
"WRITER"VARCHAR2(50)NOTNULLENABLE,
"PUBLISHER_ID"CHAR(10)NOTNULLENABLE,
"INTRODUCTION"VARCHAR2(1000),
"PUBLISH_DATE"DATENOTNULLENABLE,
"IN_DATE"TIMESTAMP(6)NOTNULLENABLE,
"ACCOUNT"NUMBER,
CONSTRAINT"PRIMARY_BOOK_ID2"PRIMARYKEY("BOOK_ID2")
9.图书分类表
BOOKKINDS
("KIND_ID"CHAR(10)NOTNULLENABLE,
"KIND_NAME"VARCHAR2(50)NOTNULLENABLE,
"FATHER_TYPE"VARCHAR2(50)NOTNULLENABLE,
CONSTRAINT"PRIMARY_KIND_ID"PRIMARYKEY("KIND_ID")
10.出版社表
PUBLISHER
("PUBLISHER_ID"CHAR(10)NOTNULLENABLE,
"TELEPHONE"CHAR(13)NOTNULLENABLE,
"FAX"CHAR(13),
"EMAIL"VARCHAR2(20),
"ADDRESS"VARCHAR2(100)NOTNULLENABLE,
"PUBLISHER_NAME"VARCHAR2(100)NOTNULLENABLE,
CONSTRAINT"PRIMARY_PUBLISHER_ID"PRIMARYKEY("PUBLISHER_ID")
(3)创建序列
创建一个名为“TUSER_SEQ”的序列,用于产生读者学号,起始值为307,步长为1,不缓存,不循环。
CREATESEQUENCETUSER_SEQSTARTWITH307INCREMENTBY1NOCACHENOCYCLE;
创建一个名为“TBOOK_SEQ”的序列,用于产生部门编号,起始值为380,步长为10,最大值为9990,不缓存,不循环.
CREATESEQUENCETBOOK_SEQSTARTWITH380INCREMENTBY10MAXVALUE9990NOCACHENOCYCLE;
创建一个seq_Borrow,用于产生读者编号,起始值为1,步长为1
Createsequenceseq_Borrowstartwith1incrementby1nocycle
(4)创建索引
在图书表上创建唯一性索引
CreateuniqueindexBook_cBooksTypeonBOOKS(BOOK_ID)tablespaceusers;
在读者表表上的sex列上创建一个位图索引
CreatebitmapindexREADERS_sexonREADERS(sex)tablespaceusers;
(5)创建视图
读者当前借阅
createorreplaceviewcurrent_borrow_viewas
select"BOOK_ID","READER_ID","BORROW_DATE","RETURN_DATE","STATE","RENEWABLE"
fromborrow_records
wherestate='1'
新进书目
createorreplaceviewnew_coming_booksas
selectbook_id2,book_name,writer,publisher_name
frombook_details,publisher
wherebook_details.publisher_id=publisher.publisher_idandbook_details.in_date>add_Months(sysdate,-1)
图书推荐
createorreplaceviewgb_recas
selectid,book_name,publisher_name,writer,b_numfrom
(selectbooks.book_id2id,count(*)b_num
fromborrow_records,books
whereborrow_records.book_id=books.book_id
groupbybooks.book_id2
),books_view
wherebooks_view.BOOK_ID2=id
orderbyb_numdesc
图书视图
CREATEORREPLACEFORCEVIEW"WIN2008"."BOOKS_VIEW"("BOOK_ID2","BOOK_NAME","WRITER","PUBLISHER_NAME","ACCOUNT","AVAILABLE_ACCOUNT","INTRODUCTION")AS
selectdistinctbook_details.BOOK_ID2,BOOK_NAME,WRITER,PUBLISHER_NAME,ACCOUNT,(selectcount(*)frombookswherebooks.book_id2=book_details.book_id2andbooks.state='1'groupbybooks.book_id2)AVAILABLE_ACCOUNT,INTRODUCTION
frombooks,book_details,publisher
wherebooks.book_id2=book_details.book_id2andbook_details.publisher_id=publisher.publisher_id
;
5.PL/SQL程序设计
(1)存储过程的设计
创建一个名为proc_Due的存储过程,实现还书操作
创建一个名为trg_BorrowBook的存储过程,返回某个学生当前没有归还的所有图书
创建名为“Pro_secure_dml”的存储过程,检查当前用户操作时间是否为工作时间,即非周六周日,时间为08:
00~18:
00
(2)函数的设计
创建一个名为func_dept_book的函数,以读者号为参数,查看借阅的书号:
创建一个名为fun_DEPT_RECORDS的函数,以图书号为参数,查看还书的日期:
(3)触发器的设计
创建名为check_borrow_book的触发器,实现读者借书时更新书的可借与不可借状态。
创建名为check_BORROW_RECORDS的触发器,当插入、删除或修改借阅信息时,统计人数,并输出
创建名为check_BORROW_number的触发器,当插入一条借书记录,保证单个人不超过10本书。
(4)包的设计
创建book_manage包,用于存储图书入库,借书,还书,时间等信息,实现获取图书,插入图书,借书,还书,续借书,更新借书记录的功能。
创建reader_manage包,用于存储读者信息,读者的借书信息,实现查询借阅信息,查询历史借阅信息,插入新读者,更新读者信息的功能。
6.PL/SQL程序开发
(1)存储过程的实现
创建一个名为proc_Due的存储过程,实现还书操作
CREATEORREPLACEPROCEDUREproc_due(
P_borrowCardIdVARCHAR2,p_ISBNVARCHAR2,p_dueDateDATEDEFAULTSYSDATE)
AS
V_numberNUMBER;
BEGIN
SELECTcount(*)INTOv_numberFROMborrow_records
WHEREREADER_ID=p_borrowCardIdANDBOOK_ID=p_isbn;
IFv_number=0THEN
RAISE_APPLICATION_ERROR(-20000,'对不去,没有相应借书记录!
');
ENDIF;
UPDATEborrow_recordsSETRETURN_DATE=p_dueDateWHEREREADER_ID=p_borrowCardIdANDBOOK_ID=p_isbn;
END;
创建一个名为trg_BorrowBook的存储过程,返回某个学生当前没有归还的所有图书
CREATEORREPLACEPROCEDUREproc_BorrowBook(
P_borrowCardIdVARCHAR2,p_bookCurssorOUTsys_refcursor)
AS
BEGIN
OPENp_bookCurssorFORSELECTbooks.book_id,BORROW_DATE,RETURN_DATEFROMbooks,borrow_records
WHEREbooks.book_id=borrow_records.book_idANDREADER_ID=p_borrowCardIdANDRETURN_DATEISNULL;
END;
创建名为“Pro_secure_dml”的存储过程,检查当前用户操作时间是否为工作时间,即非周六周日,时间为08:
00~18:
00
createorreplaceprocedurePro_secure_dml
is
begin
ifto_char(sysdate,'HH24:
MI')notbetween'08:
00'and'18:
00'orto_char(sysdate,'DY','NLS_DATE_LANGUAGE=AMERICAN')
In('SAT','SUN')thenraise_application_error(-20205,'只能在正常的工作时间内改变。
');
endif;
endPro_secure_dml;
(2)函数的实现
创建一个名为func_dept_book的函数,以读者号为参数,查看借阅的书号:
CREATEORREPLACEFUNCTIONfunc_dept_book(
p_deptnoreaders.reader_id%type)
returnborrow_records.book_id%type
as
v_maxsalborrow_records.book_id%type;
begin
selectbook_idintov_maxsalfromborrow_recordswhereborrow_records.reader_id=p_deptno;
returnv_maxsal;
exception
whenno_data_foundthen
dbms_output.put_line('nodata');
endfunc_dept_book;
创建一个名为fun_DEPT_RECORDS的函数,以图书号为参数,查看还书的日期:
CREATEORREPLACEFUNCTIONfun_DEPT_RECORDS(
p_bookidBORROW_RECORDS.BOOK_ID%type)
returnborrow_records.return_date%type
as
v_dateborrow_records.return_date%type;
begin
selectreturn_dateintov_datefromborrow_recordswhereborrow_records.book_id=p_bookid;
returnv_date;
exception