数据库oracle银行管理系统Word下载.docx
《数据库oracle银行管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《数据库oracle银行管理系统Word下载.docx(32页珍藏版)》请在冰豆网上搜索。
身份证号
Varchar2
18
telephone
联系电话
13
Address
家庭地址
50
无
银行卡信息表用于存储银行卡相关的信息主要包括卡号、存储的货币类型,存款方式,开户时间,开户金额,余额、银行卡密码、是否挂失和用户编号等信息,
表2.2银行卡信息表
cardID
卡号
curType
货币种类
10
SavingType
存款类型
8
非空
Opendate
开户日期
DATETIME
openmoney
开户金额
Balance
帐户余额
Isreportloss
是否挂失
2
Customer
开户编号
Varchar
外键
交易信息表用于存储用户的交易记录,主要包括交易日期,卡号、交易类型,交易金额等信息。
表2.3交易信息表
属性
Transdate
交易日期
Datetime
PK
transTYPE
交易类型
VARCHAR2
transMoney
交易金额
NUMBER
remark
备注
三、创建系统数据表
3.1创建表空间和用户
使用system用户连接数据库后,创建表空间space_zqp,指定数据文件为D:
\Bank.dbf,代码如下图:
图3.1表空间和用户
3.2创建用户信息表并添加约束
用户信息表保存了用户的基本信息,该表的创建语句如下,
CREATETABLEuserInfo
(
customerIDNUMBER(4)NOTNULL,
customerNameVARCHAR2(20)NOTNULL,
PIDVARCHAR2(18)NOTNULL,
telephoneVARCHAR2(13)NOTNULL,
addressVARCHAR2(50)
)
PARTITIONBYHASH(PID)
PARTITIONpid1,
PARTITIONpid2,
PARTITIONpid3,
);
ALTERTABLEuserInfo
ADDCONSTRAINTPK_customerIDPRIMARYKEY(customerID)
ADDCONSTRAINTUK_PIDUNIQUE(PID)
ADDCONSTRAINTCK_PIDCHECK(LENGTH(PID)=18ORLENGTH(PID)=15)
ADDCONSTRAINTCK_telephoneCHECK(
telephoneLIKE'
[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
OR
LENGTH(telephone)=13);
------------------创建可以自动生成自增主列的序列customerid_seq
CREATESEQUENCEcustomerid_seq
STARTWITH1
INCREMENTBY1
NOCACHE
如上述语句所示,在userInfo表中包含用户编号(customerid)、开户名(customername)、身份证号(PID)、联系电话(telephone)、家庭住址(address)。
其中,customerid为主键,自增(从1开始);
PID只能是18位或15位,并且是唯一的;
telephone必须是xxxx-xxxxxxxx的格式或13位的手机号码。
图3.2用户信息表
3.3创建银行卡信息表
银行卡信息表(cardinfo)中包含了卡号(cardid),货币种类(curType),存款类型(savingtype),开户日期(opendate),开户金额(openmoney),余额(balance),密码(pass),是否挂失(isREPORTLOSS)和用户编号(customerID)的信息。
其中,cardID为主键,必须为10103756xxxxxxxx的格式;
CURTYPE默认为RMB,openmoney必须不能低于一元;
balance也必须不能低于一元;
pass默认为88888888;
ISREPORTLOSS的值必须是“是/否”中之一,默认为否;
customerID为外键,引用userInfo表中的customerID列。
图3.3
3.4创建交易信息表
交易信息表中包含了五个字段,分别为transdate(交易日期),cardID(卡号)、TRANSTYPE(交易类型),transmoney(交易金额)和remark(备注)。
其中,transdate默认为系统当前日期;
cardid位外键,引用cardinfo表中的cardid列,可重复;
transtype只能是“存入/取出”之一;
transmoney必须大于0.
图3.4交易信息表
四、模拟常规业务操作
4.1建立更新账号触发器
结果如下:
图4.1创建beforeupdate触发器
4.2存取款交易操作
当用户办理取款或存款业务时,不仅需要向交易信息表中添加一条交易记录,还需要修改当前账户中的余额,如果办理取款业务,如果将当前账户总的余额减去支取余额,如果办理托管业务,多叫当前账户中的金额加上存款金额。
在交易信息表中包含一个名为transtype的字段,该字段用于表示交易类型,取值范围必须是存入或者自取,因此可以为transINFO表创建BEFOREINSERTR触发器。
根据要办理里的交易类型,判断出当前的交易类型,如果transtype字段值为“支取”,则表示要办理取款业务,检测当前余额是否大于或等于要支取的金额,如果满足条件,则要修改cardinfo表中的balance字段值,将该字段值减去交易金额(transmoney),如果transtype字段值为“存入”,则表示要办理存款业务,修改cardinfo表中的balance字段值,将该值加上交易金额(transmoney)。
代码如下:
reateorreplacetriggertrig_trans
beforeinsertorupdate
ontransinfo
foreachrow
declare
my_balancenumber;
rate_exceptionexception;
begin
selectbalanceintomy_balancefromcardinfowherecardid=:
new.cardid;
if:
new.transtype='
支取'
then
ifmy_balance<
:
new.transmoney-1then
dbms_output.put_line('
对不起,您的余额不足!
'
return;
elsifmy_balance>
new.transmoney-1then
updatecardinfosetbalance=balance-:
new.transmoneywherecardId=:
new.cardId;
endif;
elsif:
存入'
then
updatecardinfosetbalance=balance+:
new.transmoneywherecardid=:
交易成功!
exception
whenrate_exceptionthen
raise_application_error(-20001,'
交易失败'
end;
select*fromcardInfo_vw;
insertintotransInfo(transdate,cardID,transType,transMoney)
values(sysdate,'
1010357688886666'
'
1000);
commit;
4.3用户开户
根据身份证号查询是否在该行开过户,为万无一失,还需要查询生成的卡号是否已经被使用,如果这两个条件都符合要求(此人从未在该行开过户,生成的卡号也无人使用),则向userinfo表中插入开户人的基本信息记录,并根据开户人的身份证号获取开户人的编号,从而向cardinfo表中插入开户人的基本信息记录,同时还需要将生成的卡号显示给开户人。
如果收到卡号已经被使用,得提醒用户开户失败;
如果当前开户人已经在此行开过户,则提示用户此身份证已有账号。
结果如下图:
图4.2
4.4更改密码
一个银行账号对应一个密码,因此当用户输入的卡号密码相对应时,可以为该银行卡设置新的密码,
代码:
createorreplaceprocedureproc_updateUserPass(
temp_cardidvarchar2,--卡号
oldpassvarchar2,--旧密码
newpassvarchar2--新密码
as
inumber;
pass_iVARCHAR2(6);
begin
selectcount(*)intoifromcardInfowherecardID=temp_cardid;
selectpassintopass_ifromcardInfowherecardID=temp_cardid;
ifi=0then
此卡号不存在!
elsifi>
0then
ifpass_i=oldpassthen
UPDATEcardInfosetpass=newpasswherecardid=temp_cardid;
密码更改成功!
else
旧密码不正确!
exception
whenothersthen
密码更改失败!
end
4.5账号挂失
当用户的银行卡丢失后,可以对该卡进行挂失,银行管理系统需要验证用户的真实性,当用户输入银行卡号和密码相对应,才可以对该卡进行挂失操作,即修改cardinfo表中的IsreportLOSS列为“是”,否则提示“无权挂失”。
结果如图:
图4.3
4.6余额查询
用户可以使用银行管理系统,办理余额查询等业务,系统要求用户输入银行卡账号和密码,当用户输入的账号和密码都合法时,系统就查询该用户的账户余额,否则将提示用户“账号或密码错误!
”,
CREATEORREPLACEprocedurepro_query_balance(
card_idvarchar2,--帐户
card_passvarchar2)--密码
iNUMBER:
=0;
not_data_foundexception;
user_balanceNUMBER(8);
selectcount(*)intoifromcardInfowherecardID=card_idandpass=card_pass;
raisenot_data_found;
selectbalanceintouser_balancefromcardInfowherecardID=card_idandpass=card_pass;
你帐号的余额为:
||user_balance);
whennot_data_foundthen
帐号或密码错误!
4.7转账业务设置
自助银行管理系统办理转账业务时,要求用户输入正确的用于转账的卡号和密码,以及获得转账的卡号和转账金额,系统将根据用户输入的卡号和密码,检测该银行卡是否存在,如果存在,则判断该银行卡余额是否大于要转账的余额;
如果大于,则向表中插入两条交易记录,一条支取的记录,一条为存入的记录,并提示用户转账成功;
如果用户输入的卡号和密码不正确,则提示“你的卡号或密码有误!
”。
4.8银行盈利结算
银行的管理人员可以统计银行的资金流通余额和盈利结算,资金流动金额等于总存入-总支数金额;
盈利结算,等于总支出金额乘以8%-总存入金额乘以3%,
代码如图:
图4.4
4.9撤户操作
当用户不再需要使用某张银行卡时,可去银行办理撤户操作,撤户操作需要用户输入正确的卡号和密码,系统将根据用户输入的数据对该银行卡进行验证,如果该银行卡存在,都需要将卡上的余额全部取出,并删除该卡在cardinfo表中的记录,以及在transinfo表中所有的交易记录。
代码如下图
图4.5
五、总结
通过此次课程设计,使我更加扎实的掌握了有关数据库方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。
最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
参考文献
[1]郝安林,《Oracle11g基础教程与实验指导》,清华大学出版社
[2]王珊,《数据库系统概论》,高等教育出版社
[3]王霓虹,《数据库系统原理》,哈尔滨工业出版社(十二五规划教材)
[4]李建中,《数据库系统原理》,电子工业出版社(原理)
[5]Stephens著,《数据库设计》,机械工业出版社
[6]李丙洋.涂抹oracle--三思笔记之一步一步学oracle[M]中国水利水电出版社,2010.1
[7]
Karen
Morton.Oracle
SQL高级编程[M].人民邮电出版社,2011.11
[8]
梁敬彬,梁敬弘.收获不止oracle[M].电子工业出版社,2013.5
[9]
盖国强.循序渐进oracle数据库管理、优化与备份恢复[M].人民邮电出版社,2011.8
[10]Lan
Abramson,Micheael
Abbey,Michael
J.Corey,窦朝辉.oracle
database
11g:
初学者指南[M].清华大学出版社,2010-01
附录
程序源代码:
CREATETABLESPACEspace_zqp
DATAFILE'
D:
\Bank.dbf'
SIZE50M
AUTOEXTENDONNEXT5MMAXSIZEUNLIMITED;
创建用户zqp,用户密码:
zqp
CREATEUSERzqp
IDENTIFIEDBYzqp
DEFAULTTABLESPACEspace_zqp;
TEMPORARYTABLESPACEtemp
QUOTA20MONspace_xianglin;
//用户已创建
GRANTDBATOXIANGLIN;
//授权成功
CONNECTxianglin/accp;
//已连接
REATETABLEuserInfo
-----根据身份证ID创建散列分区
-------------------为userInfo表添加约束条件
//表已更改
NOCACHE;
//序列已创建
CREATETABLEcardIofo
cardIDVARCHAR2(20)NOTNULL,
curTypeVARCHAR2(10)NOTNULL,
savingTypeVARCHAR2(8)NOTNULL,
openDateDATENOTNULL,
openMoneyNUMBER(8)NOTNULL,
balanceNUMBER(8)NOTNULL,
passVARCHAR2(6)NOTNULL,
IsReportLossVARCHAR2
(2)NOTNULL,
customerIDNUMBER(4)NOTNULL
-------根据开户日期创建表分区
PARTITIONBYRANGE(openDate)
PARTITIONopenDate_p1VALUESLESSTHAN(TO_DATE('
01/01/2007'
dd/mm/yyyy'
)),
PARTITIONopenDate_p2VALUESLESSTHAN(TO_DATE('
01/04/2007'
PARTITIONopenDate_p3VALUESLESSTHAN(TO_DATE('
01/07/2007'
PARTITIONopenDate_p4VALUESLESSTHAN(TO_DATE('
01/10/2007'
PARTITIONopenDate_p5VALUESLESSTHAN(TO_DATE('
01/01/2008'
PARTITIONopenDate_p6VALUESLESSTHAN(TO_DATE('
01/04/2008'
PARTITIONopenDate_p7VALUESLESSTHAN(TO_DATE('
01/07/2008'
PARTITIONopenDate_p8VALUESLESSTHAN(TO_DATE('
01/10/2008'
PARTITIONopenDate_p9VALUESLESSTHAN(TO_DATE('
01/01/2009'
PARTITIONopenDate_p10VALUESLESSTHAN(TO_DATE('
01/04/2009'
PARTITIONopenDate_p11VALUESLESSTHAN(TO_DATE('
01/07/2009'
PARTITIONopenDate_p12VALUESLESSTHAN(maxvalue)
//表已创建
-------------------------为cardInfo表添加约束条件
ALTERTABLEcardIofo
ADDCONSTRAINTPK_cardIDPRIMARYKEY(cardID)
ADDCONSTRAINTCK_cardIDCHECK(
TRANSLATE(cardID,'
0123456789'
xxxxxxxxxx'
)='
xxxxxxxxxxxxxxxx'
AND
INSTR(cardID,'
10103576'
)=1)
ADDCONSTRAINTCK_s