版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.../目录TOC\o"1-3"\h\u摘要 1一、设计银行管理系统结构图1.1系统结构图 2二、银行管理系统E-R图和表结构2.1E-R图 32.2表结构 5三、创建系统数据表3.1创建表空间和用户 63.2创建用户信息表并添加约束 63.3创建银行卡信息表 83.4创建交易信息表 9四、模拟常规业务操作4.1建立更新账号触发器 114.2存取款交易操作 114.3用户开户 134.4更改密码 154.5账号挂失 164.6余额查询 164.7转账业务设置 174.8银行盈利结算 184.9撤户操作 18五、总结 20参考文献 21附录 22摘要随着计算机的飞速发展及应用领域的扩大,特别是计算机网络和电子商务的发展,极大的改变了商业银行传统的经营模式。能够为客户提供方便、快捷、安全的服务,也能够有效的降低银行的营运成本,这是银行存储系统追求的目标。目前,对于现代化银行运营的要求是客户可以实现方便安全的业务交易,银行职员可以进行高效合理的工作管理,实现银行业务电子化。方便用户快速的进行存款、取款、修改密码以及完成一些转账的交易,大大提高办公效率,能够及时、准确、有效的帮用户办理各种繁琐的手续,也减缓了银行工作人员的压力。设计银行管理系统结构图1.1系统结构图银行系统银行系统信息查询信息查询财务管理账户管理财务管理账户管理开户开户修改密码账户挂失销户存款取款转账余额查询图1.1系统结构图银行管理系统E-R图和表结构2.1E-R图身份证号开户开户信息表住址开户名身份证号开户开户信息表住址开户名开户名身份证号开户名身份证号图2.1开户开户开户金额是否挂失用户编号密码开户日期货币种类余额卡号存款类型银行信息表开户金额是否挂失用户编号密码开户日期货币种类余额卡号存款类型银行信息表图2.2卡号交易金额交易日期交易类型交易信息表交易图2.2卡号交易金额交易日期交易类型交易信息表交易2.2表结构通过对银行管理系统的需求分析,应该为该系统设计3个表,分别为用户信息表、银行卡信息表和交易信息表。用户信息表用于存储用户的基本信息,包括用户的编号、开户名、身份证号、和家庭住址等信息表2.1用户信息表字段名称字段描述数据类型长度约束customer用户编号Number4主键customer开户名Varhcar220必填PID身份证号Varchar218必填telephoneVarchar213必填Address家庭地址Varchar250无银行卡信息表用于存储银行卡相关的信息主要包括卡号、存储的货币类型,存款方式,开户时间,开户金额,余额、银行卡密码、是否挂失和用户编号等信息,表2.2银行卡信息表字段名称字段描述数据类型长度约束cardID卡号Varchar220主键curType货币种类Varhcar210必填SavingType存款类型Varchar28非空Opendate开户日期DATETIME必填openmoney开户金额Number8必填Balance帐户余额Number8必填Isreportloss是否挂失Varchar22必填Customer开户编号Varchar4外键交易信息表用于存储用户的交易记录,主要包括交易日期,卡号、交易类型,交易金额等信息。表2.3交易信息表字段名称字段描述数据类型长度属性Transdate交易日期DatetimePKcardID卡号Varhcar220非空transTYPE交易类型VARCHAR24非空transMoney交易金额NUMBER4非空remark备注VARCHAR250非空三、创建系统数据表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,>;ALTERTABLEuserInfoADDCONSTRAINTPK_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]'ORLENGTH<telephone>=13>;创建可以自动生成自增主列的序列customerid_seqCREATESEQUENCEcustomerid_seqSTARTWITH1INCREMENTBY1NOCACHE如上述语句所示,在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.33.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_transbeforeinsertorupdateontransinfoforeachrowdeclaremy_balancenumber;rate_exceptionexception;beginselectbalanceintomy_balancefromcardinfowherecardid=:new.cardid;if:new.transtype='支取'thenifmy_balance<:new.transmoney-1thendbms_output.put_line<'对不起,您的余额不足!'>;return;elsifmy_balance>:new.transmoney-1thenupdatecardinfosetbalance=balance-:new.transmoneywherecardId=:new.cardId;endif;elsif:new.transtype='存入'thenupdatecardinfosetbalance=balance+:new.transmoneywherecardid=:new.cardId; endif;dbms_output.put_line<'交易成功!'>;exceptionwhenrate_exceptionthenraise_application_error<-20001,'交易失败'>;end;select*fromcardInfo_vw;insertintotransInfo<transdate,cardID,transType,transMoney>values<sysdate,'1010357688886666','存入',1000>;commit;4.3用户开户根据身份证号查询是否在该行开过户,为万无一失,还需要查询生成的卡号是否已经被使用,如果这两个条件都符合要求〔此人从未在该行开过户,生成的卡号也无人使用,则向userinfo表中插入开户人的基本信息记录,并根据开户人的身份证号获取开户人的编号,从而向cardinfo表中插入开户人的基本信息记录,同时还需要将生成的卡号显示给开户人。如果收到卡号已经被使用,得提醒用户开户失败;如果当前开户人已经在此行开过户,则提示用户此身份证已有账号。结果如下图:图4.24.4更改密码一个银行账号对应一个密码,因此当用户输入的卡号密码相对应时,可以为该银行卡设置新的密码,代码:createorreplaceprocedureproc_updateUserPass<temp_cardidvarchar2,--卡号oldpassvarchar2,--旧密码newpassvarchar2--新密码>asinumber;pass_iVARCHAR2<6>;beginselectcount<*>intoifromcardInfowherecardID=temp_cardid;selectpassintopass_ifromcardInfowherecardID=temp_cardid;ifi=0thendbms_output.put_line<'此卡号不存在!'>;elsifi>0thenifpass_i=oldpassthenUPDATEcardInfosetpass=newpasswherecardid=temp_cardid;dbms_output.put_line<'密码更改成功!'>;elsedbms_output.put_line<'旧密码不正确!'>;endif;endif;commit;exceptionwhenothersthendbms_output.put_line<'密码更改失败!'>;end4.5账号挂失当用户的银行卡丢失后,可以对该卡进行挂失,银行管理系统需要验证用户的真实性,当用户输入银行卡号和密码相对应,才可以对该卡进行挂失操作,即修改cardinfo表中的IsreportLOSS列为"是",否则提示"无权挂失"。结果如图:图4.34.6余额查询用户可以使用银行管理系统,办理余额查询等业务,系统要求用户输入银行卡账号和密码,当用户输入的账号和密码都合法时,系统就查询该用户的账户余额,否则将提示用户"账号或密码错误!",代码:CREATEORREPLACEprocedurepro_query_balance<card_idvarchar2,--帐户card_passvarchar2>--密码asiNUMBER:=0;not_data_foundexception;user_balanceNUMBER<8>;beginselectcount<*>intoifromcardInfowherecardID=card_idandpass=card_pass;ifi=0thenraisenot_data_found;elseselectbalanceintouser_balancefromcardInfowherecardID=card_idandpass=card_pass;dbms_output.put_line<'你帐号的余额为:'||user_balance>;endif;exceptionwhennot_data_foundthendbms_output.put_line<'帐号或密码错误!'>;end;4.7转账业务设置自助银行管理系统办理转账业务时,要求用户输入正确的用于转账的卡号和密码,以及获得转账的卡号和转账金额,系统将根据用户输入的卡号和密码,检测该银行卡是否存在,如果存在,则判断该银行卡余额是否大于要转账的余额;如果大于,则向表中插入两条交易记录,一条支取的记录,一条为存入的记录,并提示用户转账成功;如果用户输入的卡号和密码不正确,则提示"你的卡号或密码有误!"。4.8银行盈利结算银行的管理人员可以统计银行的资金流通余额和盈利结算,资金流动金额等于总存入-总支数金额;盈利结算,等于总支出金额乘以8%-总存入金额乘以3%,代码如图:图4.44.9撤户操作当用户不再需要使用某张银行卡时,可去银行办理撤户操作,撤户操作需要用户输入正确的卡号和密码,系统将根据用户输入的数据对该银行卡进行验证,如果该银行卡存在,都需要将卡上的余额全部取出,并删除该卡在cardinfo表中的记录,以及在transinfo表中所有的交易记录。代码如下图图4.5五、总结通过此次课程设计,使我更加扎实的掌握了有关数据库方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行"过而能改,善莫大焉"的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!参考文献[1]郝安林,《Oracle11g基础教程与实验指导》,清华大学出版社[2]王珊,《数据库系统概论》,高等教育出版社[3]王霓虹,《数据库系统原理》,XX工业出版社〔十二五规划教材[4]李建中,《数据库系统原理》,电子工业出版社〔原理[5]Stephens著,《数据库设计》,机械工业出版社[6]李丙洋.涂抹oracle--三思笔记之一步一步学oracle[M]中国水利水电出版社,2010.1[7]KarenMorton.OracleSQL高级编程[M].人民邮电出版社,2011.11[8]梁敬彬,梁敬弘.收获不止oracle[M].电子工业出版社,2013.5[9]盖国强.循序渐进oracle数据库管理、优化与备份恢复[M].人民邮电出版社,2011.8[10]LanAbramson,MicheaelAbbey,MichaelJ.Corey,窦朝辉.oracledatabase11g:初学者指南[M].清华大学出版社,2010-01附录程序源代码:CREATETABLESPACEspace_zqpDATAFILE'D:\Bank.dbf'SIZE50MAUTOEXTENDONNEXT5MMAXSIZEUNLIMITED;创建用户zqp,用户密码:zqpCREATEUSERzqpIDENTIFIEDBYzqpDEFAULTTABLESPACEspace_zqp;TEMPORARYTABLESPACEtempQUOTA20MONspace_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表添加约束条件ALTERTABLEuserInfoADDCONSTRAINTPK_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]'ORLENGTH<telephone>=13>;//表已更改创建可以自动生成自增主列的序列customerid_seqCREATESEQUENCEcustomerid_seqSTARTWITH1INCREMENTBY1NOCACHE;//序列已创建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表添加约束条件ALTERTABLEcardIofoADDCONSTRAINTPK_cardIDPRIMARYKEY<cardID>ADDCONSTRAINTCK_cardIDCHECK<TRANSLATE<cardID,'0123456789','xxxxxxxxxx'>='xxxxxxxxxxxxxxxx'ANDINSTR<cardID,'10103576'>=1ADDCONSTRAINTCK_savCHECK<savingTypeIN<'活期','定期两便','定期'>>ADDCONSTRAINTCK_openMoneyCHECK<openMoney>=1>ADDCONSTRAINTCK_passCHECK<LENGTH<pass>=6>ADDCONSTRAINTCK_IsRePortLossCHECK<IsReportLossIN<'是','否'>>ADDCONSTRAINTFK_customerIDFOREIGNKEY<customerID>REFERENCESuserInfo<customerID>MODIFY<curTypeDEFAULT'RMB'>MODIFY<openDateDEFAULTsysdate>MODIFY<passDEFAULT888888>MODIFY<IsReportLossDEFAULT'否'>;//表已更改CREATETABLEtransInfo<transDateDATENOTNULL,cardIDVARCHAR2<20>NOTNULL,transTypeVARCHAR2<4>NOTNULL,transMoneyNUMBER<4>NOTNULL,remarkVARCHAR2<50>>根据交易时间创建表分区PARTITIONBYRANGE<transDate><PARTITIONtransDate_p1VALUESLESSTHAN<to_date<'01/01/2007','dd/mm/yyyy'>>,PARTITIONtransDate_p2VALUESLESSTHAN<to_date<'01/04/2007','dd/mm/yyyy'>>,PARTITIONtransDate_p3VALUESLESSTHAN<to_date<'01/07/2007','dd/mm/yyyy'>>,PARTITIONtransDate_p4VALUESLESSTHAN<to_date<'01/10/2007','dd/mm/yyyy'>>,PARTITIONtransDate_p5VALUESLESSTHAN<to_date<'01/01/2008','dd/mm/yyyy'>>,PARTITIONtransDate_p6VALUESLESSTHAN<to_date<'01/04/2008','dd/mm/yyyy'>>,PARTITIONtransDate_p7VALUESLESSTHAN<to_date<'01/07/2008','dd/mm/yyyy'>>,PARTITIONtransDate_p8VALUESLESSTHAN<to_date<'01/10/2008','dd/mm/yyyy'>>,PARTITIONtransDate_p9VALUESLESSTHAN<to_date<'01/01/2009','dd/mm/yyyy'>>,PARTITIONtransDate_p10VALUESLESSTHAN<to_date<'01/04/2009','dd/mm/yyyy'>>,PARTITIONtransDate_p11VALUESLESSTHAN<to_date<'01/07/2009','dd/mm/yyyy'>>,PARTITIONtransDate_p12VALUESLESSTHAN<maxvalue>>;//表已创建为transInfo表添加表约束ALTERTABLEtransInfoADDCONSTRAINTFK_cardIDFOREIGNKEY<cardID>REFERENCEScardIofo<cardID>ADDCONSTRAINTCK_transTypeCHECK<transTypeIN<'存入','支取'>>ADDCONSTRAINTCK_transMoneyCHECK<transMoney>0>MODIFY<transDateDEFAULTsysdate>;//表已更改--创建userInfo表视图CREATEORREPLACEVIEWuserInfo_vwASSELECTcustomerIDas用户编号,customerNameas用户名称,PIDas身份证号,telephoneas,addressas家庭住址FROMuserInfo;--创建cardInfo表视图CREATEORREPLACEVIEWcardInfo_vwASSELECTcardIDas银行卡号,curTypeas货币类型,savingTYpeas存款类型,openDateas开户日期,openMoneyas开户金额,balanceas余额,passas密码,IsReportLossas是否挂失,customerIDas用户编号FROMcardInfo;--创建transInfo表视图CREATEORREPLACEVIEWtransInfo_vwASselecttransDateas交易日期,cardIDas卡号,transTypeas交易类型,transMoneyas交易金额,remarkas备注FROMtransInfo;--创建查询挂失的客户信息视图CREATEORREPLACEVIEWuserInfo_IsReportLoss_vwASselectu.customerIDas用户编号,u.customerNameas开户名,u.pidas身份证号,u.telephoneas,u.addressas家庭地址FROMuserInfouINNERJOINcardInfocONu.customerID=c.customerIDWHEREIsReportLoss='是';--创建查询本周开户的卡号显示相关信息视图CREATEORREPLACEVIEWquery_week_information_vwASSELECTcardIDas卡号,curTypeas货币类型,savingTypeas存款类型,openDateas开户日期,openMoneyas开户金额,balanceas余额,passas密码,IsReportLossas是否挂失,customerIDas用户编号FROMcardInfoWHEREopenDateBETWEENTRUNC<sysdate,'day'>ANDsysdate;--创建查询本月交易金额最高的卡号的视图CREATEORREPLACEVIEWtop_balance_vwASSELECTDISTINCTcardIDas交易最高的卡号,transMoneyas交易金额FROMtransInfoWHEREtransMoney=<SELECTMax<transMoney>FROMtransInfo>;查看视图select*fromuserInfo_vw;--userInfo表视图select*fromcardInfo_vw;--cardInfo表视图select*fromtransInfo_vw;--transInfo表视图select*fromuserInfo_IsReportLoss_vw;--查询挂失的客户信息视图select*fromquery_week_information_vw;--查询本周开户的卡号select*fromtop_balance_vw;--查询本月交易金额最高的卡号/*selectu.customerNameas客户名字,c.balanceas余额,t.transMoneyas交易金额fromuserInfou,cardInfoc,transInfotwhereu.customerName='张三'andu.customerid=c.customeridandc.cardid=t.cardid;selectu.customerNameas客户名称,c.balanceas余额fromuserInfouINNERJOINcardInfoconu.customername='张三'andu.customerid=c.customerid;*/--不允许更新cardInfo表的cardID列--不能更新卡号的触发器createorreplacetriggertrg_cardInfo_cardID_notUpdatebeforeupdateofcardIDoncardInfoforeachrowbeginraise_application_error<-20001,'此列不允许修改!'>;end;--创建触发器实现交易操作createorreplacetriggertrig_transbeforeinsertorupdateontransinfoforeachrowdeclaremy_balancenumber;rate_exceptionexception;beginselectbalanceintomy_balancefromcardinfowherecardid=:new.cardid;if:new.transtype='支取'thenifmy_balance<:new.transmoney-1thendbms_output.put_line<'对不起,您的余额不足!'>;return;elsifmy_balance>:new.transmoney-1thenupdatecardinfosetbalance=balance-:new.transmoneywherecardId=:new.cardId;endif;elsif:new.transtype='存入'thenupdatecardinfosetbalance=balance+:new.transmoneywherecardid=:new.cardId; endif;dbms_output.put_line<'交易成功!'>;exceptionwhenrate_exceptionthenraise_application_error<-20001,'交易失败'>;end;select*fromcardInfo_vw;--插入交易数据自动触发一系列操作insertintotransInfo<transdate,cardID,transType,transMoney>values<sysdate,'1010357688886666','存入',1000>;commit;select*fromcardInfo_vw;select*fromtransInfo_vw;createorreplaceTRIGGERtrg_cardIofo_card_notUpdateBEFOREUPDATEOFcardIDONcardIofoFOREACHROWBEGINRAISE_APPLICATION_ERROR<-20001,'账号不允许修改'>;END;CREATEORREPLACEFUNCTIONrandom_cardIdRETURNVARCHAR2AScard_idVARCHAR2<20>:='10103576';temCHAR<5>;re_card_id_countNUMBER:=0;BEGINLOOPtem:=to_char<dbms_random.value<1000,9999>,'0000'>;card_id:=card_id||tem;tem:=to_char<dbms_random.value<1000,9999>,'0000'>;card_id:=card_id||tem;SELECTCOUNT<*>INTOre_card_id_countFROMcardInfoWHEREcardID=card_id;EXITWHENre_card_id_count=0;ENDLOOP;RETURNcard_id;END;开户过程:CREATEORREPLACEprocedureproc_openUser<unamevarchar2,--开户的姓名p_idvarchar2,--身份证telvarchar2,--电话号码addressvarchar2,--地址savingtypevarchar2,--存款类型curTypevarchar2,--货币类型openMoneynumber,--开户金额passvarchar2--开户密码>ascidvarchar2<20>;--卡号customer_idnumber;--顾客IDiNUMBER;cNUMBER;Begin--调用函数生成卡号cid:=random_cardId;--查询此人是否在此行开过户selectcount<*>intoifromuserinfowherePID=p_id;--查询卡号是否应该有了selectcount<*>intocfromcardinfowherecardID=cid;ifi=0thenifc=0thenInsertintouserInfovalues<customerid_seq.nextval,uname,p_id,tel,address>;--根据身份证号获取顾客编号selectcustomerIdintocustomer_idfromuserInfowherePID=p_id;insertintocardInfo<cardId,curType,Savingtype,Openmoney,balance,pass,customerId>values<cid,curType,savingType,openMoney,openMoney,pass,customer_id>;DBMS_OUTPUT.PUT_LINE<'您已成功开户!'>;DBMS_OUTPUT.PUT_LINE<'您的卡号为:'||cid>;elsifc>0thendbms_output.put_line<'开户失败!'>;endif;elsifi>0thendbms_output.put_line<'此身份证已开有帐号!'>;ENDIF;EXCEPTIONwhenothersthendbms_output.put_line<'开户失败!'>;end;createorreplaceprocedureproc_updateUserPass<temp_cardidvarchar2,--卡号oldpassvarchar2,--旧密码newpassvarchar2--新密码>asinumber;pass_iVARCHAR2<6>;beginselectcount<*>intoifromcardInfowherecardID=temp_cardid;selectpassintopass_ifromcardInfowherecardID=temp_cardid;ifi=0thendbms_output.put_line<'此卡号不存在!'>;elsifi>0thenifpass_i=oldpassthenUPDATEcardInfosetpass=newpasswherecardid=temp_cardid;dbms_output.put_line<'密码更改成功!'>;elsedbms_output.put_line<'旧密码不正确!'>;endif;endif;commit;exceptionwhenothersthendbms_output.put_line<'密码更改失败!'>;Endcreateorreplaceprocedureproc_lostCard<card_idvarchar2,pass2varchar2>asxchar<2>;inumber;beginselectcount<*>intoifromcardInfowherecardId=card_idandpass=pass2;ifi>0THENSELECTIsReportLossINTOxfromcardInfowherecardId=card_idandpass=pass2;ifx='是'thendbms_output.put_line<'此卡已经挂失!'>;elseUPDATEcardInfosetIsReportLoss='是'wherecardId=card_id;dbms_output.put_line<'该卡已成功挂失,请带相关证件到柜台去办理恢复该卡!'>; endif; ELSEdbms_output.put_line<'挂失失败!请核实卡号是否正确!'>; ENDIF;end;存取款:CREATEORREPLACEPROCEDUREproc_takeMoney<temp_cardIdVARCHAR2,--卡号temp_transTypeVARCHAR2,--交易类型temp_passVARCHAR2,--密码temp_transMoneyNUMBER,--交易金额temp_remarkVARCHAR2--备注>AStemp_pwdVARCHAR2<6>;BEGINIFtemp_transType='支取'THEN--取款SELECTpassINTOtemp_pwdFROMcardInfoWHEREcardID=temp_cardId;IFtemp_pwd=temp_passTHENINSERTINTOtransInfo<transType,cardID,transMoney,remark>VALUES<temp_transType,temp_cardId,temp_transMoney,temp_remark>;ELSEDBMS_OUTPUT.PUT_LINE<'密码错误,请重新输入!'>;ENDIF;ELSINSERTINTOtransInfo<transType,cardID,transMoney,remark>VALUES<'存入',temp_cardId,temp_transMoney,temp_remark>;ENDIF;END;余额查询:CREATEORREPLACEprocedurepro_query_balance<card_idvarchar2,--帐户card_passvarchar2>--密码asiNUMBER:=0;not_data_foundexception;user_balanceNUMBER<8>;beginselectcount<*>intoifromcardInfowherecardID=card_idandpass=card_pass;ifi=0thenraisenot_data_found;elseselectbalanceintouser_balancefromcardInfowherecardID=card_idandpass=card_pass;dbms_output.put_line<'你帐号的余额为:'||user_balance>;endif;exceptionwhennot_data_foundthendbms_output.put_line<'帐号或密码错误!'>;end;转账:createorreplaceprocedurepro_transfer<from_card
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (正式版)DB12∕T 898-2019 《鹊山鸡育雏技术规范》
- 2026届高三生物二轮复习课件:大单元3 细胞的增殖、分化、衰老和死亡等生命历程 层级1 主干知识落实清单
- 医疗数据安全治理:区块链价值重构路径分析
- 脉搏短绌课件
- 医疗数据安全成熟度:区块链应用场景
- 医疗数据安全应急演练的应急预案优化路径
- 医疗数据安全合规自动化检查工具
- 胚胎发育课件
- 医疗数据安全合规审计的共识机制流程
- 医疗数据安全共享的生态构建
- 在线网课学习课堂《人工智能(北理 )》单元测试考核答案
- 桩基中的钢筋笼工程量EXCLE表计算
- 2024年员工考勤表(通用版)
- 模型制作说课稿(宁远一中-何喜梅)通用技术省级示范课剖析
- 高州市2022年“缅茄杯”学科竞赛数学试卷及参考答案
- 第13章-狭义相对论习题
- 中国石化油品销售企业实验室信息管理系统LIMSWeb操作手册
- NY/T 5161-2002无公害食品虹鳟养殖技术规范
- 石淋(尿石症)中医诊疗方案
- 《金融学》期末考试复习题库(带答案)
- 教科版小学科学小实验气动火箭课件
评论
0/150
提交评论