大数据库oracle银行管理系统.docx
- 文档编号:3869037
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:32
- 大小:189.11KB
大数据库oracle银行管理系统.docx
《大数据库oracle银行管理系统.docx》由会员分享,可在线阅读,更多相关《大数据库oracle银行管理系统.docx(32页珍藏版)》请在冰豆网上搜索。
大数据库oracle银行管理系统
摘要
随着计算机的飞速发展及应用领域的扩大,特别是计算机网络和电子商务的发展,极大的改变了商业银行传统的经营模式。
能够为客户提供方便、快捷、安全的服务,也能够有效的降低银行的营运成本,这是银行存储系统追求的目标。
目前,对于现代化银行运营的要求是客户可以实现方便安全的业务交易,银行职员可以进行高效合理的工作管理,实现银行业务电子化。
方便用户快速的进行存款、取款、修改密码以及完成一些转账的交易,大大提高办公效率,能够及时、准确、有效的帮用户办理各种繁琐的手续,也减缓了银行工作人员的压力。
1、设计银行管理系统结构图
1.1系统结构图
银行系统
图1.1系统结构图
2、银行管理系统E-R图和表结构
2.1E-R图
图2.1
图2.2
2.2表结构
通过对银行管理系统的需求分析,应该为该系统设计3个表,分别为用户信息表、银行卡信息表和交易信息表。
用户信息表用于存储用户的基本信息,包括用户的编号、开户名、身份证号、联系电话和家庭住址等信息
表2.1用户信息表
字段名称
字段描述
数据类型
长度
约束
customer
用户编号
Number
4
主键
customer
开户名
Varhcar2
20
必填
PID
身份证号
Varchar2
18
必填
telephone
联系电话
Varchar2
13
必填
Address
家庭地址
Varchar2
50
无
银行卡信息表用于存储银行卡相关的信息主要包括卡号、存储的货币类型,存款方式,开户时间,开户金额,余额、银行卡密码、是否挂失和用户编号等信息,
表2.2银行卡信息表
字段名称
字段描述
数据类型
长度
约束
cardID
卡号
Varchar2
20
主键
curType
货币种类
Varhcar2
10
必填
SavingType
存款类型
Varchar2
8
非空
Opendate
开户日期
DATETIME
必填
openmoney
开户金额
Number
8
必填
Balance
帐户余额
Number
8
必填
Isreportloss
是否挂失
Varchar2
2
必填
Customer
开户编号
Varchar
4
外键
交易信息表用于存储用户的交易记录,主要包括交易日期,卡号、交易类型,交易金额等信息。
表2.3交易信息表
字段名称
字段描述
数据类型
长度
属性
Transdate
交易日期
Datetime
PK
cardID
卡号
Varhcar2
20
非空
transTYPE
交易类型
VARCHAR2
4
非空
transMoney
交易金额
NUMBER
4
非空
remark
备注
VARCHAR2
50
非空
三、创建系统数据表
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:
new.transtype='存入'then
updatecardinfosetbalance=balance+:
new.transmoneywherecardid=:
new.cardId;
endif;
dbms_output.put_line('交易成功!
');
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
dbms_output.put_line('此卡号不存在!
');
elsifi>0then
ifpass_i=oldpassthen
UPDATEcardInfosetpass=newpasswherecardid=temp_cardid;
dbms_output.put_line('密码更改成功!
');
else
dbms_output.put_line('旧密码不正确!
');
endif;
endif;
commit;
exception
whenothersthen
dbms_output.put_line('密码更改失败!
');
end
4.5账号挂失
当用户的银行卡丢失后,可以对该卡进行挂失,银行管理系统需要验证用户的真实性,当用户输入银行卡号和密码相对应,才可以对该卡进行挂失操作,即修改cardinfo表中的IsreportLOSS列为“是”,否则提示“无权挂失”。
结果如图:
图4.3
4.6余额查询
用户可以使用银行管理系统,办理余额查询等业务,系统要求用户输入银行卡账号和密码,当用户输入的账号和密码都合法时,系统就查询该用户的账户余额,否则将提示用户“账号或密码错误!
”,
代码:
CREATEORREPLACEprocedurepro_query_balance(
card_idvarchar2,--帐户
card_passvarchar2)--密码
as
iNUMBER:
=0;
not_data_foundexception;
user_balanceNUMBER(8);
begin
selectcount(*)intoifromcardInfowherecardID=card_idandpass=card_pass;
ifi=0then
raisenot_data_found;
else
selectbalanceintouser_balancefromcardInfowherecardID=card_idandpass=card_pass;
dbms_output.put_line('你帐号的余额为:
'||user_balance);
endif;
exception
whennot_data_foundthen
dbms_output.put_line('帐号或密码错误!
');
end;
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
(
customerIDNUMBER(4)NOTNULL,
customerNameVARCHAR2(20)NOTNULL,
PIDVARCHAR2(18)NOTNULL,
telephoneVARCHAR2(13)NOTNULL,
addressVARCHAR2(50)
)
-----根据身份证ID创建散列分区
PARTITIONBYHASH(PID)
(
PARTITIONpid1,
PARTITIONpid2,
PARTITIONpid3,
);
-------------------为userInfo表添加约束条件
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;//序列已创建
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','dd/mm/yyyy')),
PARTITIONopenDate_p3VALUESLESSTHAN(TO_DATE('01/07/2007','dd/mm/yyyy')),
PARTITIONopenDate_p4VALUESLESSTHAN(TO_DATE('01/10/2007','dd/mm/yyyy')),
PARTITIONopenDate_p5VALUESLESSTHAN(TO_DATE('01/01/2008','dd/mm/yyyy')),
PARTITIONopenDate_p6VALUESLESSTHAN(TO_DATE('01/04/2008','dd/mm/yyyy')),
PARTITIONopenDate_p7VALUESLESSTHAN(TO_DATE('01/07/2008','dd/mm/yyyy')),
PARTITIONopenDate_p8VALUESLESSTHAN(TO_DATE('01/10/2008','dd/mm/yyyy')),
PARTITIONopenDate_p9VALUESLESSTHAN(TO_DATE('01/01/2009','dd/mm/yyyy')),
PARTITIONopenDate_p10VALUESLESSTHAN(TO_DATE('01/04/2009','dd/mm/yyyy')),
PARTITIONopenDate_p11VALUESLESSTHAN(TO_DATE('01/07/2009','dd/mm/yyyy')),
PARTITIONopenDate_p12VALUESLESSTHAN(maxvalue)
);//表已创建
-------------------------为cardInfo表添加约束条件
ALTERTABLEcardIofo
ADDCONSTRAINTPK_cardIDPRIMARYKEY(cardID)
ADDCONSTRAINTCK_cardIDCHECK(
TRANSLATE(cardID,'0123456789','xxxxxxxxxx')='xxxxxxxxxxxxxxxx'AND
INSTR(cardID,'10103576')=1)
ADDCONSTRAINTCK_savCHECK(
savingTypeIN('活期','定期两便','定期'))
A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 oracle 银行 管理 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)