1、大数据库oracle银行管理系统摘 要 随着计算机的飞速发展及应用领域的扩大,特别是计算机网络和电子商务的发展,极大的改变了商业银行传统的经营模式。能够为客户提供方便、快捷、安全的服务,也能够有效的降低银行的营运成本,这是银行存储系统追求的目标。目前,对于现代化银行运营的要求是客户可以实现方便安全的业务交易,银行职员可以进行高效合理的工作管理,实现银行业务电子化。方便用户快速的进行存款、取款、修改密码以及完成一些转账的交易,大大提高办公效率,能够及时、准确、有效的帮用户办理各种繁琐的手续,也减缓了银行工作人员的压力。1、设计银行管理系统结构图1.1系统结构图银行系统 图1.1系统结构图2、银行
2、管理系统E-R图和表结构2.1E-R图 图2.1 图2.22.2表结构 通过对银行管理系统的需求分析,应该为该系统设计3个表,分别为用户信息表、银行卡信息表和交易信息表。 用户信息表用于存储用户的基本信息,包括用户的编号、开户名、身份证号、联系电话和家庭住址等信息 表2.1 用户信息表字段名称字段描述数据类型长度约束customer用户编号Number4主键customer开户名Varhcar220必填PID身份证号Varchar218必填telephone联系电话Varchar213必填Address家庭地址Varchar250无 银行卡信息表用于存储银行卡相关的信息主要包括卡号、存储的货币
3、类型,存款方式,开户时间,开户金额,余额、银行卡密码、是否挂失和用户编号等信息, 表2.2银行卡信息表字段名称字段描述数据类型长度约束cardID卡号Varchar220主键curType货币种类Varhcar210必填SavingType存款类型Varchar28非空Opendate开户日期DATETIME必填openmoney开户金额Number8必填Balance帐户余额Number8必填Isreportloss是否挂失Varchar22必填Customer开户编号Varchar4外键 交易信息表用于存储用户的交易记录,主要包括交易日期,卡号、交易类型,交易金额等信息。 表2.3交易信息
4、表字段名称字段描述数据类型长度属性Transdate交易日期DatetimePKcardID卡号Varhcar220非空transTYPE交易类型VARCHAR24非空transMoney交易金额NUMBER4非空remark备注VARCHAR250非空 三、创建系统数据表3.1创建表空间和用户 使用system用户连接数据库后,创建表空间space_zqp,指定数据文件为D:Bank.dbf,代码如下图: 图3.1表空间和用户3.2创建用户信息表并添加约束用户信息表保存了用户的基本信息,该表的创建语句如下,CREATE TABLE userInfo(customerID NUMBER(4)
5、NOT NULL,customerName VARCHAR2(20) NOT NULL,PID VARCHAR2(18) NOT NULL,telephone VARCHAR2(13) NOT NULL,address VARCHAR2(50)PARTITION BY HASH(PID)( PARTITION pid1, PARTITION pid2, PARTITION pid3,);ALTER TABLE userInfoADD CONSTRAINT PK_customerID PRIMARY KEY(customerID)ADD CONSTRAINT UK_PID UNIQUE(PID)
6、ADD CONSTRAINT CK_PID CHECK(LENGTH(PID)=18 OR LENGTH(PID)=15)ADD CONSTRAINT CK_telephone CHECK(telephone LIKE 0-90-90-90-9-0-90-90-90-90-90-90-90-9ORLENGTH(telephone)=13);-创建可以自动生成自增主列的序列 customerid_seqCREATE SEQUENCE customerid_seqSTART WITH 1INCREMENT BY 1NOCACHE 如上述语句所示,在userInfo表中包含用户编号(customer
7、id)、开户名(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
8、)和用户编号(customerID)的信息。其中,cardID为主键,必须为1010 3756 xxxx xxxx的格式;CURTYPE默认为RMB,openmoney必须不能低于一元;balance也必须不能低于一元;pass默认为88888888;ISREPORTLOSS的值必须是“是/否”中之一,默认为否;customerID为外键,引用userInfo表中的customerID列。图3.3 3.4创建交易信息表 交易信息表中包含了五个字段,分别为transdate(交易日期),cardID(卡号)、TRANSTYPE(交易类型),transmoney(交易金额)和remark(备注)。
9、其中,transdate默认为系统当前日期;cardid位外键,引用cardinfo表中的cardid列,可重复;transtype只能是“存入/取出”之一;transmoney必须大于0.图3.4交易信息表四、模拟常规业务操作4.1建立更新账号触发器结果如下:图4.1创建before update触发器4.2存取款交易操作 当用户办理取款或存款业务时,不仅需要向交易信息表中添加一条交易记录,还需要修改当前账户中的余额,如果办理取款业务,如果将当前账户总的余额减去支取余额,如果办理托管业务,多叫当前账户中的金额加上存款金额。 在交易信息表中包含一个名为transtype的字段,该字段用于表示交
10、易类型,取值范围必须是存入或者自取,因此可以为transINFO表创建BEFORE INSERTR触发器。根据要办理里的交易类型,判断出当前的交易类型,如果transtype字段值为“支取”,则表示要办理取款业务,检测当前余额是否大于或等于要支取的金额,如果满足条件,则要修改cardinfo表中的balance字段值,将该字段值减去交易金额(transmoney),如果transtype字段值为“存入”,则表示要办理存款业务,修改cardinfo表中的balance字段值,将该值加上交易金额(transmoney)。代码如下:reate or replace trigger trig_tran
11、sbefore insert or update on transinfofor each rowdeclare my_balance number;rate_exception exception;begin select balance into my_balance from cardinfo where cardid=:new.cardid; if :new.transtype=支取 then if my_balance:new.transmoney-1 then update cardinfo set balance=balance-:new.transmoney where car
12、dId=:new.cardId; end if;elsif :new.transtype=存入 thenupdate cardinfo set balance=balance+:new.transmoney where cardid=:new.cardId; end if; dbms_output.put_line(交易成功!); exception when rate_exception then raise_application_error(-20001,交易失败); end;select * from cardInfo_vw;insert into transInfo (transda
13、te,cardID,transType,transMoney) values(sysdate,1010 3576 8888 6666,存入,1000);commit;4.3用户开户 根据身份证号查询是否在该行开过户,为万无一失,还需要查询生成的卡号是否已经被使用,如果这两个条件都符合要求(此人从未在该行开过户,生成的卡号也无人使用),则向userinfo表中插入开户人的基本信息记录,并根据开户人的身份证号获取开户人的编号,从而向cardinfo表中插入开户人的基本信息记录,同时还需要将生成的卡号显示给开户人。如果收到卡号已经被使用,得提醒用户开户失败;如果当前开户人已经在此行开过户,则提示用户
14、此身份证已有账号。 结果如下图:图4.24.4更改密码 一个银行账号对应一个密码,因此当用户输入的卡号密码相对应时,可以为该银行卡设置新的密码,代码: create or replace procedure proc_updateUserPass(temp_cardid varchar2, -卡号oldpass varchar2, -旧密码newpass varchar2 -新密码)asi number;pass_i VARCHAR2(6);beginselect count(*) into i from cardInfo where cardID=temp_cardid;select pas
15、s into pass_i from cardInfo where cardID=temp_cardid;if i=0 thendbms_output.put_line(此卡号不存在!);elsif i0 thenif pass_i=oldpass thenUPDATE cardInfo set pass=newpass where cardid=temp_cardid;dbms_output.put_line(密码更改成功!);elsedbms_output.put_line(旧密码不正确!);end if;end if;commit;exceptionwhen others thendbm
16、s_output.put_line(密码更改失败!);end4.5账号挂失 当用户的银行卡丢失后,可以对该卡进行挂失,银行管理系统需要验证用户的真实性,当用户输入银行卡号和密码相对应,才可以对该卡进行挂失操作,即修改cardinfo表中的IsreportLOSS列为“是”,否则提示“无权挂失”。结果如图: 图4.34.6余额查询 用户可以使用银行管理系统,办理余额查询等业务,系统要求用户输入银行卡账号和密码,当用户输入的账号和密码都合法时,系统就查询该用户的账户余额,否则将提示用户“账号或密码错误!”,代码:CREATE OR REPLACE procedure pro_query_balan
17、ce(card_id varchar2, -帐户card_pass varchar2) -密码asi NUMBER:=0;not_data_found exception;user_balance NUMBER(8);beginselect count(*) into i from cardInfo where cardID=card_id and pass=card_pass;if i=0 thenraise not_data_found;elseselect balance into user_balance from cardInfo where cardID=card_id and p
18、ass=card_pass;dbms_output.put_line(你帐号的余额为:|user_balance);end if;exceptionwhen not_data_found thendbms_output.put_line(帐号或密码错误!);end;4.7转账业务设置 自助银行管理系统办理转账业务时,要求用户输入正确的用于转账的卡号和密码,以及获得转账的卡号和转账金额,系统将根据用户输入的卡号和密码,检测该银行卡是否存在,如果存在,则判断该银行卡余额是否大于要转账的余额;如果大于,则向表中插入两条交易记录,一条支取的记录,一条为存入的记录,并提示用户转账成功;如果用户输入的卡号
19、和密码不正确,则提示“你的卡号或密码有误!”。4.8银行盈利结算 银行的管理人员可以统计银行的资金流通余额和盈利结算,资金流动金额等于总存入-总支数金额;盈利结算,等于总支出金额乘以8%-总存入金额乘以3%,代码如图:图4.44.9撤户操作 当用户不再需要使用某张银行卡时,可去银行办理撤户操作,撤户操作需要用户输入正确的卡号和密码,系统将根据用户输入的数据对该银行卡进行验证,如果该银行卡存在,都需要将卡上的余额全部取出,并删除该卡在cardinfo表中的记录,以及在transinfo表中所有的交易记录。代码如下图图4.5五、总 结 通过此次课程设计,使我更加扎实的掌握了有关数据库方面的知识,在
20、设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘
21、,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!参考文献1郝安林,Oracle 11g基础教程与实验指导,清华大学出版社 2王珊,数据库系统概论,高等教育出版社3王霓虹,数据库系统原理 ,哈尔滨工业出版社(十二五规划教材)4李建中,数据库系统原理,电子工业出版社(原理)5Stephens著,数据库设计,机械工业出版社6李丙洋.涂抹oracle-三思笔记之一步一步学oracleM中国水利水电出版社,2010.17KarenMorton.OracleSQL高级编程M.人民邮电出版社,2011.118梁敬彬,梁敬弘.收获不止oracleM.电子工业出版社,2
22、013.59盖国强.循序渐进oracle数据库管理、优化与备份恢复M.人民邮电出版社,2011.810LanAbramson,MicheaelAbbey,MichaelJ.Corey,窦朝辉.oracledatabase11g:初学者指南M.清华大学出版社,2010-01附录程序源代码:CREATE TABLESPACE space_zqpDATAFILE D:Bank.dbf SIZE 50MAUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;创建用户zqp,用户密码:zqpCREATE USER zqpIDENTIFIED BY zqpDEFAULT TABLE
23、SPACE space_zqp;TEMPORARY TABLESPACE tempQUOTA 20M ON space_xianglin;/用户已创建GRANT DBA TO XIANGLIN;/授权成功CONNECT xianglin/accp;/已连接REATE TABLE userInfo(customerID NUMBER(4) NOT NULL,customerName VARCHAR2(20) NOT NULL,PID VARCHAR2(18) NOT NULL,telephone VARCHAR2(13) NOT NULL,address VARCHAR2(50)-根据身份证ID
24、创建散列分区PARTITION BY HASH(PID)( PARTITION pid1, PARTITION pid2, PARTITION pid3,);-为userInfo表添加约束条件ALTER TABLE userInfoADD CONSTRAINT PK_customerID PRIMARY KEY(customerID)ADD CONSTRAINT UK_PID UNIQUE(PID)ADD CONSTRAINT CK_PID CHECK(LENGTH(PID)=18 OR LENGTH(PID)=15)ADD CONSTRAINT CK_telephone CHECK(tele
25、phone LIKE 0-90-90-90-9-0-90-90-90-90-90-90-90-9ORLENGTH(telephone)=13);/表已更改-创建可以自动生成自增主列的序列 customerid_seqCREATE SEQUENCE customerid_seqSTART WITH 1INCREMENT BY 1NOCACHE;/序列已创建CREATE TABLE cardIofo(cardID VARCHAR2(20) NOT NULL,curType VARCHAR2(10) NOT NULL,savingType VARCHAR2(8) NOT NULL,openDate
26、DATE NOT NULL,openMoney NUMBER(8) NOT NULL,balance NUMBER(8) NOT NULL,pass VARCHAR2(6) NOT NULL,IsReportLoss VARCHAR2(2) NOT NULL,customerID NUMBER(4) NOT NULL)-根据开户日期创建表分区PARTITION BY RANGE(openDate)(PARTITION openDate_p1 VALUES LESS THAN(TO_DATE(01/01/2007,dd/mm/yyyy),PARTITION openDate_p2 VALUES
27、LESS THAN(TO_DATE(01/04/2007,dd/mm/yyyy),PARTITION openDate_p3 VALUES LESS THAN(TO_DATE(01/07/2007,dd/mm/yyyy),PARTITION openDate_p4 VALUES LESS THAN(TO_DATE(01/10/2007,dd/mm/yyyy),PARTITION openDate_p5 VALUES LESS THAN(TO_DATE(01/01/2008,dd/mm/yyyy),PARTITION openDate_p6 VALUES LESS THAN(TO_DATE(01
28、/04/2008,dd/mm/yyyy),PARTITION openDate_p7 VALUES LESS THAN(TO_DATE(01/07/2008,dd/mm/yyyy),PARTITION openDate_p8 VALUES LESS THAN(TO_DATE(01/10/2008,dd/mm/yyyy),PARTITION openDate_p9 VALUES LESS THAN(TO_DATE(01/01/2009,dd/mm/yyyy),PARTITION openDate_p10 VALUES LESS THAN(TO_DATE(01/04/2009,dd/mm/yyyy
29、),PARTITION openDate_p11 VALUES LESS THAN(TO_DATE(01/07/2009,dd/mm/yyyy),PARTITION openDate_p12 VALUES LESS THAN(maxvalue);/表已创建-为cardInfo表添加约束条件ALTER TABLE cardIofoADD CONSTRAINT PK_cardID PRIMARY KEY(cardID)ADD CONSTRAINT CK_cardID CHECK(TRANSLATE(cardID,0123456789 ,xxxxxxxxxx )=xxxx xxxx xxxx xxxx ANDINSTR(cardID,1010 3576 )=1)ADD CONSTRAINT CK_sav CHECK(savingType IN (活期,定期两便,定期)A
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1