Oracle图书管理系统.docx
《Oracle图书管理系统.docx》由会员分享,可在线阅读,更多相关《Oracle图书管理系统.docx(13页珍藏版)》请在冰豆网上搜索。
![Oracle图书管理系统.docx](https://file1.bdocx.com/fileroot1/2022-12/15/44434edc-61b2-47ad-a95e-7ae3a22f1820/44434edc-61b2-47ad-a95e-7ae3a22f18201.gif)
Oracle图书管理系统
图书管理系统
参与人员:
组长:
冀佳伟12111100220
组员:
梁恒宇12111100219
赵一兆12111100217
刘鼎12111100218
胡明池12111100232
项目分工:
冀佳伟负责总体设计与表的创建
梁恒宇负责绘图
赵一兆负责视图创建
刘鼎负责触发器创建
胡明池负责序列创建
总体设计
表设计
BOOK_CLASS表结构及其约束
字段名
数据类型
长度
约束
说明
classid
NUMBER
11
主码
学科类型编号
classname
VARCHAR2
20
NOTNULL
学科类型名称
demo
VARCHAR2
100
说明
BOOK_TYPE表结构及其约束
字段名
数据类型
长度
约束
说明
typeid
NUMBER
11
主码
图书类型编号
typename
VARCHAR2
20
NOTNULL
图书类型名称
demo
VARCHAR2
100
说明
BOOK表结构及其约束
字段名
数据类型
长度
约束
说明
bookid
NUMBER
11
主码
书籍编号
bookname
VARCHAR2
20
NOTNULL
书籍名称
author1
VARCHAR2
20
NOTNULL
书籍作者
author2
VARCHAR2
20
书籍作者
author3
VARCHAR2
20
书籍作者
pubdate
DATE
出版日期
publish
VARCHAR2
30
出版社
photo
VARCHAR2
100
图片地址
abstract
VARCHAR2
4000
内容简介
price
NUMBER
7,2
NOTNULL
价格
ISBN
VARCHAR2
17
NOTNULL
书籍ISBN码
bookclass
NUMBER
11
外码
学科类型
booktype
NUMBER
11
外码
藏书类型
READER_TYPE表结构及其约束
字段名
数据类型
长度
约束
说明
typeid
NUMBER
11
主码
图书类型编号
typename
VARCHAR2
20
NOTNULL
图书类型名称
demo
VARCHAR2
100
说明
READER表结构及其约束
字段名
数据类型
长度
约束
说明
readerid
NUMBER
11
主码
读者编号
name
VARCHAR2
10
NOTNULL
读者姓名
telephone
VARCHAR2
15
联系电话
email
VARCHAR2
30
邮箱地址
dept
VARCHAR2
20
所在院系
right
NUMBER
1
取值为0或1
借阅权限
readertype
NUMBER
11
外码
读者类型
demo
VARCHAR2
1000
说明
BORROW表结构及其约束
字段名
数据类型
长度
约束
说明
readerid
NUMBER
11
外码
联合
主码
读者编号
bookid
NUMBER
11
外码
图书编号
borrowdate
DATE
出借日期
due
DATE
应还日期
last_due
DATE
实际归还日期
RULE表结构及其约束
字段名
数据类型
长度
约束
说明
booktype
NUMBER
11
外码
联合
主码
藏书类型编号
readertype
NUMBER
11
外码
读者类型编号
days
NUMBER
5
NOTNULL
期限(天)
num
NUMBER
5
NOTNULL
册数(本)
renew
NUMBER
5
NOTNULL
续借次数(次)
overtime
NUMBER
5,2
NOTNULL
逾期处罚
(元/册/天)
ADMIN表结构及其约束
字段名
数据类型
长度
约束
说明
Id
NUMBER
11
主码
管理员编号
username
VARCHAR2
10
NOTNULL
管理员账号
password
VARCHAR2
11
NOTNULL
账号密码
PRECONCERT(预约表)表结构及其约束
字段名
数据类型
长度
约束
说明
readerid
NUMBER
11
主码
联合
主码
读者编号
bookid
NUMBER
11
主码
图书编号
predate
DATE
预约日期
创建admin表
CREATETABLEadmin(
idNUMBER(11)PRIMARYKEY,
usernameVARCHAR2(10)NOTNULL,
pASswordVARCHAR2(11)NOTNULL);
创建reader_type表
CREATETABLEreader_type(
typeidNUMBER(11)PRIMARYKEY,
typenameVARCHAR2(20)NOTNULL,
demoVARCHAR2(100));
创建reader表
CREATETABLEreader(
readeridNUMBER(11)PRIMARYKEY,
nameVARCHAR2(10)NOTNULL,
telephoneVARCHAR2(15),
emailVARCHAR2(30),deptVARCHAR2(20),
rightNUMBER
(1)CHECK(right=0orright=1),
readertypeNUMBER(11)REFERENCESreader_type(typeid),
demoVARCHAR2(1000));
创建book_type表
CREATETABLEbook_type(
typeidNUMBER(11)PRIMARYKEY,
typenameVARCHAR2(20)NOTNULL,
demoVARCHAR2(100));
创建book_class表
CREATETABLEbook_class(
clASsidNUMBER(11)PRIMARYKEY,
clASsnameVARCHAR2(20)NOTNULL,
demoVARCHAR2(100));
创建book表
CREATETABLEbook(
bookidNUMBER(11)PRIMARYKEY,
booknameVARCHAR2(20)NOTNULL,
author1VARCHAR2(20)NOTNULL,
author2VARCHAR2(20),
author3VARCHAR2(20),
pubDATEDATE,publishVARCHAR2(30),
photoVARCHAR2(100),
abstractVARCHAR2(4000),
priceNUMBER(7,2)NOTNULL,
isbnVARCHAR2(17)NOTNULL,
bookclASsNUMBER(11)REFERENCESbook_clASs(clASsid),
booktypeNUMBER(11)REFERENCESbook_type(typeid));
创建borrow表
CREATETABLEborrow(
readeridNUMBER(11)REFERENCESreader(readerid),
bookidNUMBER(11)REFERENCESbook(bookid),borrowdateDATE,
dueDATE,last_dueDATE,
PRIMARYKEY(readerid,bookid));
创建preconcert表
CREATETABLEpreconcert(
readeridNUMBER(11)REFERENCESreader(readerid),
bookidNUMBER(11)REFERENCESbook(bookid),
predateDATE,
PRIMARYKEY(readerid,bookid));
创建rule表
CREATETABLErule(
booktypeNUMBER(11)REFERENCESbook_type(typeid),
readertypeNUMBER(11)REFERENCESreader_type(typeid),
daysNUMBER(5)NOTNULL,
numNUMBER(5)NOTNULL,
renewNUMBER(5)NOTNULL,
overtimeNUMBER(5,2)NOTNULL,
PRIMARYKEY(booktype,readertype));
序列的创建
CREATESEQUENCEseq_readerSTARTWITH1INCREMENTBY10000;
CREATESEQUENCEseq_bookSTARTWITH1INCREMENTBY100;
创建视图reader_book_view
CREATEORREPLACEVIEWreader_book_view
AS
SELECTname,bookname,borrowdate,due,last_due
FROMreader,book,borrow
WHWERreader.readid=borrow.readidANDborrow.bookid=book.bookid;
创建视图book_type_stat_view
CREATEORREPLACEVIEWbook_type_stat_view
AS
SELECTbooktype,COUNT(booktype)
FROM(SELECTreaderid,borrow.booktype,
Booktype,borrowdate,due,last_due
FROMborrow,book
WHEREbook.bookid=borrow.bookid)
计算借阅超期天数的存储过程
CREATEORREPLACEPROCEDUREp_days_FROM_due(
v_readeridNUMBER,v_bookidNUMBER,v_daysoutNUMBER)
AS
BEGIN
SELECTdue–sysdateINTOv_daysFROMborrow
WHEREreaderid=v_readeridANDbookid=v_bookid;
IFv_days<=0THEN
v_day:
=0;
ENDIF;
END;
计算图书应归还日期的函数
CREATEORREPLACEFUNCTIONf_date_is_due(
v_readeridNUMBER,v_bookidNUMBER)
RETURNVARCHAR2
AS
v_booktypeNUMBER;
v_readertypeNUMBER;
v_dateVARCHAR2(10);
BEGIN
SELECTbooktypeINTOv_booktypeFROMbookWHEREbookid=v_bookid;
SELECTreadertypeINTOv_readertypeFROMreaderWHEREreaderid=v_readerid;
SELECTto_char(sysdate+days,'yyyy-mm-dd')INTOv_dateFROMrule
WHEREreadertype=v_readertypeANDbooktype=v_booktype;
RETURNv_date;
END;
计算超期罚款的存储过程
CREATEORREPLACEPROCEDUREp_timeover_money(
v_readeridNUMBER,v_bookidNUMBER,v_moneyOUTNUMBER)
AS
v_daysNUMBER;
v_readertypeNUMBER;
v_booktypeNUMBER;
BEGIN
p_days_from_due(v_readerid,v_bookid,v_days);
SELECTbooktypeINTOv_booktypeFROMbookWHEREbookid=v_bookid;
SELECTreadertypeINTOv_readertypeFROMreaderWHEREreaderid=v_readerid;
SELECTovertime*floor(abs(v_days))INTOv_moneyFROMrule
WHEREreadertype=v_readertypeANDbooktype=v_booktype;
END;
判断读者可否进行借阅的存储过程
CREATEORREPLACEPROCEDUREp_can_borrow(
v_readeridNUMBER,v_bookidNUMBER,v_numOUTNUMBER)
AS
v_rightNUMBER;
v_borrowed_numNUMBER;
v_rule_numNUMBER;
BEGIN
SELECTrightINTOv_rightFROMreaderWHEREreaderid=v_readerid;
v_borrowed_num:
=f_borrowed_num(v_readerid,v_bookid);
v_rule_num:
=f_rule_num(v_readerid,v_bookid);
IFv_right=1THEN
v_num:
=0;
ELSE
v_num:
=v_rule_num-v_borrowed_num;
ENDIF;
EXCEPTION
WHENOTHERSTHEN
v_num:
=0;
END;
为BOOK表创建一个触发器,当插入新书籍时显示新书籍的书籍编号、出版社和价格;当更新书籍价格时,显示修改前后书籍价格;当删除书籍时,显示被删除的书籍编号、出版社和价格。
CREATEORREPLACETRIGGERtrg_dml_row
BEFOREINSERTORUPDATEORDELETE
ONBOOK
FOREACHROW
BEGIN
IFINSERTINGTHEN
DBMS_OUTPUT.PUT_LINE(:
new.bookid||''||
:
new.publish||''||:
new.price);
ELSIFUPDATINGTHEN
DBMS_OUTPUT.PUT_LINE(:
old.price||''||:
new.price);
ELSEDBMS_OUTPUT.PUT_LINE(:
old.bookid||''||:
old.publish||''||:
old.price);
ENDIF;
ENDtrg_dml_row;
为BOOK表创建一个触发器,当修改书籍价格时,保证修改后的价格高于修改前的价格。
CREATEORREPLACETRIGGERtrg_update_row
BEFOREUPDATEOFprice
ONBOOK
FOREACHROW
WHEN(new.price<=old.price)
BEGIN
RAISE_APPLICATION_ERROR(-20001,'Thepriceislower!
');
ENDtrg_update_row;
包体创建
CREATEORREPLACEPACKAGEBODYpkg_eno
AS
PROCEDUREupdate_sal(p_noNUMBER,p_salNUMBER)
AS
BEGIN
SELECTmin(price),max(price)INTOminsal,maxsal
FROMBOOK;
IFp_salBETWEENminsalANDmaxsalTHEN
UPDATEBOOKSETprice=p_sal
WHEREbookid=p_no;
IFSQL%NOTFOUNDTHEN
RAISE_APPLICATION_ERROR(-20000,'TheBOOKdoesn''texist');
ENDIF;
ELSE
RAISEe_beyondbound;
ENDIF;
EXCEPTION
WHENe_beyondboundTHEN
DBMS_OUTPUT.PUT_LINE('Thepriceisbeyondbound!
');
ENDupdate_sal;
PROCEDUREadd_book(p_noNUMBER,p_salNUMBER)
AS
BEGIN
SELECTmin(price),max(price)INTOminsal,maxsal
FROMBOOK;
IFp_salBETWEENminsalANDmaxsalTHEN
INSERTINTOBOOK(bookid,bookname,author1,pubdate,publish,price)
VALUES(p_no,'JAVA教程',’king’,'2009-10-03','电子出版社',p_sal);
ELSE
RAISEe_beyondbound;
ENDIF;
EXCEPTION
WHENe_beyondboundTHEN
DBMS_OUTPUT.PUT_LINE('Thepriceisbeyondbound!
');
ENDadd_book;
ENDpkg_eno;