目录摘要 (1)一、设计银行管理系统结构图1.1系统结构图 (2)二、银行管理系统E-R图和表结构2.1E-R图 (3)2.2表结构 (5)三、创建系统数据表3.1创建表空间和用户 (6)3.2创建用户信息表并添加约束 (6)3.3创建银行卡信息表 (8)3.4创建交易信息表 (9)四、模拟常规业务操作4.1建立更新账号触发器 (11)4.2存取款交易操作 (11)4.3用户开户 (12)4.4更改密码 (15)4.5账号挂失 (16)4.6余额查询 (16)4.7转账业务设置 (17)4.8银行盈利结算 (18)4.9撤户操作 (18)五、总结 (20)参考文献 (21)附录 (22)摘要随着计算机的飞速发展及应用领域的扩大,特别是计算机网络和电子商务的发展,极大的改变了商业银行传统的经营模式。
能够为客户提供方便、快捷、安全的服务,也能够有效的降低银行的营运成本,这是银行存储系统追求的目标。
目前,对于现代化银行运营的要求是客户可以实现方便安全的业务交易,银行职员可以进行高效合理的工作管理,实现银行业务电子化。
方便用户快速的进行存款、取款、修改密码以及完成一些转账的交易,大大提高办公效率,能够及时、准确、有效的帮用户办理各种繁琐的手续,也减缓了银行工作人员的压力。
一、设计银行管理系统结构图1.1系统结构图图1.1系统结构图银行系统账户管理财务管理信息查询开户修改密码 账户挂失销户存款取款转账余额查询二、银行管理系统E-R图和表结构2.1E-R图图2.12.2表结构通过对银行管理系统的需求分析,应该为该系统设计3个表,分别为用户信息表、银行卡信息表和交易信息表。
用户信息表用于存储用户的基本信息,包括用户的编号、开户名、身份证号、联系电话和家庭住址等信息银行卡信息表用于存储银行卡相关的信息主要包括卡号、存储的货币类型,存款方式,开户时间,开户金额,余额、银行卡密码、是否挂失和用户编号等信息,交易信息表用于存储用户的交易记录,主要包括交易日期,卡号、交易类型,交易金额等信息。
表2.3交易信息表三、创建系统数据表3.1创建表空间和用户使用system用户连接数据库后,创建表空间space_zqp,指定数据文件为D:\Bank.dbf,代码如下图:图3.1表空间和用户3.2创建用户信息表并添加约束用户信息表保存了用户的基本信息,该表的创建语句如下,CREATE TABLE userInfo(customerID NUMBER(4) NOT NULL,customerName V ARCHAR2(20) NOT NULL,PID V ARCHAR2(18) NOT NULL,telephone V ARCHAR2(13) NOT NULL,address V ARCHAR2(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)ADD CONSTRAINT CK_PID CHECK(LENGTH(PID)=18 OR LENGTH(PID)=15) ADD CONSTRAINT CK_telephone CHECK(telephone LIKE '[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_seqCREATE SEQUENCE customerid_seqSTART WITH 1INCREMENT BY 1NOCACHE如上述语句所示,在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为主键,必须为1010 3756 xxxx xxxx的格式;CURTYPE默认为RMB,openmoney必须不能低于一元;balance也必须不能低于一元;pass默认为88888888;ISREPORTLOSS的值必须是“是/否”中之一,默认为否;customerID 为外键,引用userInfo表中的customerID列。
图3.33.4创建交易信息表交易信息表中包含了五个字段,分别为transdate(交易日期),cardID(卡号)、TRANSTYPE(交易类型),transmoney(交易金额)和remark(备注)。
其中,transdate 默认为系统当前日期;cardid位外键,引用cardinfo表中的cardid列,可重复;transtype只能是“存入/取出”之一;transmoney必须大于0.图3.4交易信息表四、模拟常规业务操作4.1建立更新账号触发器结果如下:图4.1创建before update触发器4.2存取款交易操作当用户办理取款或存款业务时,不仅需要向交易信息表中添加一条交易记录,还需要修改当前账户中的余额,如果办理取款业务,如果将当前账户总的余额减去支取余额,如果办理托管业务,多叫当前账户中的金额加上存款金额。
在交易信息表中包含一个名为transtype的字段,该字段用于表示交易类型,取值范围必须是存入或者自取,因此可以为transINFO表创建BEFORE INSERTR 触发器。
根据要办理里的交易类型,判断出当前的交易类型,如果transtype字段值为“支取”,则表示要办理取款业务,检测当前余额是否大于或等于要支取的金额,如果满足条件,则要修改cardinfo表中的balance字段值,将该字段值减去交易金额(transmoney),如果transtype字段值为“存入”,则表示要办理存款业务,修改cardinfo表中的balance字段值,将该值加上交易金额(transmoney)。
代码如下:reate or replace trigger trig_transbefore insert or updateon transinfofor each rowdeclaremy_balance number;rate_exception exception;beginselect balance into my_balance from cardinfo where cardid=:new.cardid;if :new.transtype='支取' thenif my_balance<:new.transmoney-1 thendbms_output.put_line('对不起,您的余额不足!');return;elsif my_balance>:new.transmoney-1 thenupdate cardinfo set balance=balance-:new.transmoney where cardId=:new.cardId; end if;elsif :new.transtype='存入' thenupdate cardinfo set balance=balance+:new.transmoney where cardid=:new.cardId; end if;dbms_output.put_line('交易成功!');exceptionwhen rate_exception thenraise_application_error(-20001,'交易失败');end;select * from cardInfo_vw;insert into transInfo (transdate,cardID,transType,transMoney)values(sysdate,'1010 3576 8888 6666','存入',1000);commit;4.3用户开户根据身份证号查询是否在该行开过户,为万无一失,还需要查询生成的卡号是否已经被使用,如果这两个条件都符合要求(此人从未在该行开过户,生成的卡号也无人使用),则向userinfo表中插入开户人的基本信息记录,并根据开户人的身份证号获取开户人的编号,从而向cardinfo表中插入开户人的基本信息记录,同时还需要将生成的卡号显示给开户人。
如果收到卡号已经被使用,得提醒用户开户失败;如果当前开户人已经在此行开过户,则提示用户此身份证已有账号。
结果如下图:图4.24.4更改密码一个银行账号对应一个密码,因此当用户输入的卡号密码相对应时,可以为该银行卡设置新的密码,代码:create or replace procedure proc_updateUserPass(temp_cardid varchar2, --卡号oldpass varchar2, --旧密码newpass varchar2 --新密码)asi number;pass_i V ARCHAR2(6);beginselect count(*) into i from cardInfo where cardID=temp_cardid;select pass into pass_i from cardInfo where cardID=temp_cardid;if i=0 thendbms_output.put_line('此卡号不存在!');elsif i>0 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 thendbms_output.put_line('密码更改失败!');end4.5账号挂失当用户的银行卡丢失后,可以对该卡进行挂失,银行管理系统需要验证用户的真实性,当用户输入银行卡号和密码相对应,才可以对该卡进行挂失操作,即修改cardinfo表中的IsreportLOSS列为“是”,否则提示“无权挂失”。