zoukankan      html  css  js  c++  java
  • Oracle项目实战之ATM

      废话不多说,直接上需求:

    步骤一:创建表空间,创建用户【用户默认操作新建的表空间】,创建表,并为各表添加约束

    用户表:用户ID,姓名,身份证,联系电话,联系地址

    要求:

    1. 用户ID为主键
    2. 身份证号码唯一,15或18位
    3. 为用户ID创建序列,用于用户ID自增

    银行卡信息表:卡号,币种(人民币),存储类型(定期,活期),开户时间,开户金额,当前账目余额,密码,是否挂失,用户的ID

    要求:

    1. 卡号主键,卡号必须是0-9的数字,格式xxxx xxxx xxxx xxxx以1010 3576开头
    2. 存储类型只能是下面三种之一:活期,定期,活定两便
    3. 开户金额必须大于1元
    4. 密码必须大于6位
    5. 是否挂失只能是下面两种之一:是,否
    6. 用户的ID是外键,关联用户表的主键。
    7. 币种默认”RMB” 
    8. 开户时间默认当前时间
    9. 密码默认888888
    10. 是否挂失默认:否
    11. 根据卡号创建银行卡信息表的索引优化表查询。

    交易信息表:交易日期,卡号,交易类型,交易金额,备注

    要求:

    1. 卡号为外键,关联银行卡信息表主键
    2. 交易类型只能是下面两种之一:存入,支取
    3. 交易金额必须大于0
    4. 交易时间默认为当前时间

    注意:对于三张表都要创建公有同义词,便于以后的查询。

    测试:分别添加两条用户表,银行卡信息表

    步骤二:创建视图,要求如下:

    1.创建 用户表表视图

    2.创建银行卡信息表视图

    3.创建交易信息表视图

    4.创建查询挂失的客户信息视图

    5.创建 查询本周开户的卡号 显示相关信息视图

    6.创建 查询本月交易金额最高的卡号 的视图

    测试:分别测试上面个视图是否显示正常

    步骤三:创建触发器,要求如下:

    1.不允许修改卡号:当更新的是银行卡信息表的卡号时提示“此列不允许修改”

    2.当交易信息表有插入或者修改记录,银行卡信息表跟随改变:如交易信息表新增一条支取,那么对应的银行信息卡余额应该减少对应支取的金额。同理如交易信息表新增一条存入,那么对应的银行信息卡余额应该增加对应存入的金额。注意:如果支取先判断余额,不足则提示。如交易成功打印恭喜信息。

    测试:分别针对交易信息表做支取和存入的操作。

    步骤四:创建针对用户信息的程序包及程序包主体内容

    1. 创建函数:卡号随机生成,注意卡号的格式1010 3576 XXXX XXXX
    2. 创建开户的存储过程:注意卡号调用上面函数,开户过程包含插入信息到用户表及银行卡信息表
    3. 创建修改密码的存储过程
    4. 创建挂失账号的存储过程

    测试:执行开户的存储过程,执行修改密码的存储过程,执行挂失的存储过程

    步骤五:创建针对银行卡信息表的程序包及程序包主体内容

    1. 创建支取和存入的存储过程,注意只需要操作交易表,而银行卡信息表的余额由上面步骤三中的触发器维护
    2. 创建查询余额存储过程
    3. 创建转账存储过程,注意:判断要转账及要转入的账户是否都存在,转账金额是否充足,发生异常交易失败要回滚
    4. 创建汇总存储过程(对于银行来说流通余额=所有存入-所有取出)(对于银行来说盈利结算=所有存入*0.003-所有支取*0.008),
    5. 创建销户存储过程,注意销户要删除用户信息表,银行卡信息表,交易信息表中于之相关的所有记录

    测试:执行取钱和存钱的存储过程,执行查询余额的存储过程,执行转账的存储过程,执行汇总的存储过程,执行销户的存储过程

    实现:

     1 /*---------------------------------------------
     2  *ATM项目练习--表空间-用户管理
     3  *站在西瓜上的猪
     4  *操作用户:scott
     5  *2017/09/25 08:50
     6  -----------------------------------------------*/
     7  --创建表空间
     8  CREATE TABLESPACE ATM_TEST 
     9 Datafile 'F:\tablespace\ATM_TEST.DBF'
    10 size 1M
    11 autoextend on 
    12 next 5m maxsize 100m ;
    13 --创建表用户
    14 CREATE USER atm_dba IDENTIFIED BY 123456 DEFAULT TABLESPACE ATM_TEST;
    15 --用户授权给予开发者角色,允许创建用户,允许权限传递
    16 GRANT RESOURCE,CREATE user,CREATE SESSION TO atm_dba WITH ADMIN OPTION;
    17 --查看用户权限
    18 select * from role_sys_privs;
    19 select * from user_sys_privs;
    20 select * from user_tab_privs;
      1 /*---------------------------------------------
      2  *ATM项目练习--表,视图管理
      3  *站在西瓜上的猪
      4  操作用户:atm_dba
      5  *2017/09/25 09:10
      6  -----------------------------------------------*/
      7  --用户表:用户ID,姓名,身份证,联系电话,联系地址
      8 /*------------------------------------
      9  *要求:
     10  *1.    用户ID为主键
     11  *2.    身份证号码唯一,15或18位 
     12  *3.    为用户ID创建序列,用于用户ID自增
     13  -------------------------------------*/
     14  create TABLE user_atm(
     15  u_id NUMBER NOT NULL PRIMARY KEY ,
     16  u_name varchar2(20) NOT  NULL,
     17  u_card_Num varchar2(18) NOT NULL,
     18  u_contact_num varchar2(12) NOT NULL,
     19 u_contact_address varchar2(50) ,
     20 --创建唯一索引
     21 CONSTRAINT u_card_num_unique UNIQUE(u_card_Num)
     22  )TABLESPACE ATM_TEST;
     23 
     24 --银行卡信息表:卡号,币种(人民币),存储类型(定期,活期),开户时间,开户金额,当前账目余额,密码,是否挂失,用户的ID
     25 /*要求:
     26 
     27 1.    卡号主键,卡号必须是0-9的数字,格式xxxx xxxx xxxx xxxx以1010 3576开头
     28 2.    存储类型只能是下面三种之一:活期,定期,活定两便
     29 3.    开户金额必须大于1元
     30 4.    密码必须大于6位
     31 5.    是否挂失只能是下面两种之一:是,否
     32 6.    用户的ID是外键,关联用户表的主键。
     33 7.    币种默认”RMB”  
     34 8.    开户时间默认当前时间
     35 9.    密码默认888888
     36 10.    是否挂失默认:否
     37 11.    根据卡号创建银行卡信息表的索引优化表查询。
     38 */
     39 --Bank card
     40 /*Card number, currency (RMB), storage type (regular, current account), 
     41 account opening time, account opening amount, current account balance, 
     42 password, whether to report loss, user ID*/
     43 
     44 create TABLE Bank_card_atm(
     45 card_id CHAR(19) NOT NULL PRIMARY Key,
     46 card_currency varchar2(20) DEFAULT'RMB' NOT null ,
     47 card_STORAGE varchar2(10) DEFAULT'活期' NOT NULL,
     48 card_ao_time DATE DEFAULT SYSDATE NOT NULL,
     49 card_ao_amount NUMBER DEFAULT 1.1 NOT NULL,
     50 card_current_balance NUMBER  NOT NULL,
     51 card_PASSWORD varchar2(20) DEFAULT '888888' NOT NULL,
     52 card_report_loss varchar2(2) DEFAULT '' NOT NULL,
     53 u_id NUMBER NOT NULL,
     54 CONSTRAINT card_id_check Check(REGEXP_LIKE(card_id,'^(1010 3576) \d{4} \d{4}$')),
     55 CONSTRAINT card_STORAGE_check CHECK(card_STORAGE IN('活期','定期','活定两便')),
     56 CONSTRAINT card_ao_amount_check CHECK(card_ao_amount>=1),
     57 CONSTRAINT card_PASSWORD_check CHECK(REGEXP_LIKE(card_PASSWORD,'^[[:alnum:]]{6,20}$')),
     58 CONSTRAINT bc_u_fk FOREIGN KEY (u_id) REFERENCES  user_atm(u_id) ON DELETE CASCADE
     59 )TABLESPACE ATM_TEST;
     60 
     61 
     62 --交易信息表:交易日期,卡号,交易类型,交易金额,备注
     63 /*要求:
     64 1.    卡号为外键,关联银行卡信息表主键
     65 2.    交易类型只能是下面两种之一:存入,支取
     66 3.    交易金额必须大于0
     67 4.    交易时间默认为当前时间*/
     68 create TABLE Transaction_information_atm(
     69 Tr_DATE DATE DEFAULT SYSDATE NOT NULL,
     70 card_id CHAR(19) NOT null,
     71 Tr_type varchar2(4) DEFAULT '存入' NOT NULL,
     72 Tr_amount NUMBER  DEFAULT 0.1 NOT NULL,
     73 Tr_remark varchar2(100),
     74 CONSTRAINT tri_c_fk FOREIGN KEY (card_id) REFERENCES  Bank_card_atm(card_id) ON DELETE CASCADE,
     75 CONSTRAINT Tr_type CHECK(Tr_type IN ('存入','支出')),
     76 CONSTRAINT Tr_amount_check CHECK(Tr_amount>=0)
     77 )TABLESPACE ATM_TEST;
     78 
     79 
     80 
     81 /*DROP TABLE  ATM_TEST.user_atm;
     82 DROP TABLE  Bank_card_atm ;
     83 DROP TABLE  Transaction_information_atm;*/
     84 select * from user_atm
     85 select * FROM atmsuer;
     86 select * FROM atmbc;
     87 SELECT * FROM atmtrin;
     88 
     89 INSERT INTO ATMSUER
     90 VALUES
     91   (U_ID_SEQ.NEXTVAL, '骆武辉', '450921199601042456', '18877572911', '广西玉林');
     92 INSERT INTO ATMBC
     93 VALUES
     94   ('1010 3576 4000 0000', 'RMB', '活期', SYSDATE, 200, 200, '12345678', '', 2);
     95 INSERT INTO ATMBC
     96 VALUES
     97   ('1010 3576 4000 5856', 'RMB', '活期', SYSDATE, 200, 200, '12345dashg678', '', 2);
     98 INSERT INTO ATMBC
     99   (CARD_ID, U_ID)
    100 VALUES
    101   ('1010 3576 4000 5890', 3);
    102     
    103 INSERT INTO atmtrin
    104 VALUES
    105   (SYSDATE,'1010 3576 4000 5890','支出',300,'test');
    106     
    107     
    108 --1.创建 用户表表视图
    109 CREATE or replace VIEW user_view_atm AS SELECT * FROM  user_atm;
    110 SELECT * FROM user_view_atm;
    111 --2.创建银行卡信息表视图
    112 CREATE or replace VIEW bc_view_atm AS SELECT * FROM  Bank_card_atm;
    113 SELECT * FROM bc_view_atm;
    114 --3.创建交易信息表视图
    115 CREATE or replace VIEW trin_view_atm AS SELECT * FROM  Transaction_information_atm;
    116 SELECT * FROM trin_view_atm;
    117 --4.创建查询挂失的客户信息视图
    118 CREATE or replace VIEW report_loss_atm AS SELECT user_atm.*,Bank_card_atm.Card_Id,Bank_card_atm.Card_Current_Balance FROM  Bank_card_atm,user_atm WHERE Bank_card_atm.Card_Report_Loss='' AND Bank_card_atm.u_Id=user_atm.u_id;
    119 SELECT * FROM report_loss_atm;
    120 --5.创建 查询本周开户的卡号 显示相关信息视图
    121 CREATE or replace VIEW bc_iw_atm as
    122  select * FROM Bank_card_atm where to_char(card_ao_time,'iw')=to_char(sysdate,'iw') ;
    123  SELECT * FROM bc_iw_atm;
    124 --6.创建 查询本月交易金额最高的卡号 的视图
    125 CREATE or replace VIEW bc_mmmax_atm AS
    126 SELECT *
    127   FROM BANK_CARD_ATM,
    128        (SELECT B.CARD_ID CID
    129           FROM BANK_CARD_ATM B,
    130                (SELECT CARD_ID,
    131                        SUM(TR_AMOUNT) SUMM
    132                   FROM TRANSACTION_INFORMATION_ATM
    133                  WHERE TO_CHAR(TR_DATE, 'mm') = TO_CHAR(SYSDATE, 'mm')
    134                  GROUP BY CARD_ID) SS
    135          WHERE B.CARD_ID = SS.CARD_ID
    136          ORDER BY SS.SUMM DESC) TT
    137  WHERE ROWNUM = 1
    138    AND BANK_CARD_ATM.CARD_ID = TT.CID;
    139      --测试
    140  SELECT * FROM bc_mmmax_atm;
    141 --创建同义词
    142 --表同义词
    143 CREATE OR REPLACE SYNONYM atmsuer FOR user_atm;
    144 CREATE OR REPLACE SYNONYM atmbc FOR Bank_card_atm;
    145 CREATE OR REPLACE SYNONYM atmtrin FOR Transaction_information_atm;
    146 --视图同义词
    147 CREATE OR REPLACE SYNONYM atmviewuser FOR user_view_atm;
    148 SELECT * FROM atmviewuser;
    149 CREATE OR REPLACE SYNONYM atmviewbcmmmax FOR bc_mmmax_atm;
    150 CREATE OR REPLACE SYNONYM atmviewbc FOR bc_view_atm;
    151 CREATE OR REPLACE SYNONYM atmviewtrin FOR trin_view_atm;
    152 CREATE OR REPLACE SYNONYM atmviewrl FOR report_loss_atm;
    153 CREATE OR REPLACE SYNONYM atmviewbciw FOR bc_iw_atm;
    154     SELECT * FROM USER_VIEWS;  
      1 /*---------------------------------------------
      2  *ATM项目练习--触发器,序列,函数
      3  *站在西瓜上的猪
      4  操作用户:atm_dba
      5  *2017/09/25 09:10
      6  -----------------------------------------------*/
      7  --序列 -------------------- S
      8 --创建序列 用于u_id 自动递增 --------------------user
      9 -- Create sequence 
     10 create sequence u_id_seq
     11 start with 1
     12 increment by 1
     13 NOMINVALUE
     14 NOMAXVALUE
     15 cache 20;
     16  --序列 -------------------- E
     17  --触发器 -------------------S
     18 --创建触发器 实现id自增长,检查身份证号码--------------------user BEFORE INSERT
     19 CREATE OR REPLACE TRIGGER ATM_USER_TR 
     20   BEFORE INSERT ON USER_ATM
     21   FOR EACH ROW
     22 BEGIN
     23  --判断长度
     24   IF NOT (REGEXP_LIKE(:new.U_CARD_NUM, '^\d{15}$') OR REGEXP_LIKE(:new.U_CARD_NUM, '^\d{18}$')) 
     25        
     26   THEN
     27     RAISE_APPLICATION_ERROR(-20001, '字符格式错误');
     28   END IF;
     29      --自增
     30   IF :new.U_ID IS NULL
     31   THEN
     32     SELECT U_ID_SEQ.NEXTVAL
     33       INTO :NEW.U_ID
     34       FROM DUAL;
     35   END IF;
     36 END;
     37 
     38 --BC BEFORE INSERT
     39 CREATE OR REPLACE TRIGGER ATM_BC_TR 
     40   BEFORE INSERT ON Bank_card_atm
     41   FOR EACH ROW
     42 BEGIN
     43   --
     44   IF :new.card_current_balance IS NULL
     45   THEN
     46    :new.card_current_balance:=:new.card_ao_amount;
     47   END IF;
     48 END;
     49 --1.不允许修改卡号:当更新的是银行卡信息表的卡号时提示“此列不允许修改”
     50 CREATE OR REPLACE TRIGGER ATM_BC_restrict_TR 
     51   BEFORE update ON Bank_card_atm
     52     FOR EACH ROW
     53 BEGIN
     54   --
     55   IF updating('card_id')
     56   THEN
     57    RAISE_APPLICATION_ERROR(-20002, '此列不允许修改');
     58   END IF;
     59 END;
     60 
     61 CREATE OR REPLACE TRIGGER ATM_BC_restrict_TR 
     62   BEFORE UPDATE OF card_id ON Bank_card_atm
     63     FOR EACH ROW
     64 BEGIN
     65   --
     66   IF updating
     67   THEN
     68    RAISE_APPLICATION_ERROR(-20002, '此列不允许修改');
     69   END IF;
     70 END;
     71 UPDATE Bank_card_atm SET card_id=500 ;
     72 
     73 
     74 /*2.当交易信息表有插入或者修改记录,银行卡信息表跟随改变:
     75 如交易信息表新增一条支取,那么对应的银行信息卡余额应该减少对应支取的金额。
     76 同理如交易信息表新增一条存入,那么对应的银行信息卡余额应该增加对应存入的金额。
     77 注意:如果支取先判断余额,不足则提示。如交易成功打印恭喜信息。
     78 */
     79 CREATE OR REPLACE TRIGGER ATM_TRIN_BC_TR
     80  BEFORE  UPDATE OR INSERT ON TRANSACTION_INFORMATION_ATM
     81   FOR EACH ROW
     82 DECLARE
     83   CUNUM NUMBER;
     84 BEGIN
     85   CASE
     86     WHEN UPDATING THEN
     87       IF :OLD.TR_AMOUNT <= :NEW.TR_AMOUNT
     88       THEN
     89         UPDATE BANK_CARD_ATM
     90            SET CARD_CURRENT_BALANCE = CARD_CURRENT_BALANCE +
     91                                        (:NEW.TR_AMOUNT - :OLD.TR_AMOUNT)
     92          WHERE CARD_ID = :new.CARD_ID;
     93 
     94       ELSE
     95         UPDATE BANK_CARD_ATM
     96            SET CARD_CURRENT_BALANCE = CARD_CURRENT_BALANCE -
     97                                        (:OLD.TR_AMOUNT - :NEW.TR_AMOUNT)
     98          WHERE CARD_ID = :new.CARD_ID;
     99     
    100       END IF;
    101     WHEN INSERTING THEN
    102     
    103       IF :NEW.TR_TYPE = '存入'
    104       THEN
    105        UPDATE BANK_CARD_ATM
    106            SET CARD_CURRENT_BALANCE = CARD_CURRENT_BALANCE +:NEW.TR_AMOUNT
    107          WHERE CARD_ID =:NEW.CARD_ID;
    108          DBMS_OUTPUT.PUT_LINE('恭喜存款成功!');
    109       ELSE
    110         IF CUNUM < :NEW.TR_AMOUNT
    111         THEN
    112           RAISE_APPLICATION_ERROR(-20003, '余额不足!你的余额为:' + CUNUM);
    113         ELSE
    114           UPDATE BANK_CARD_ATM
    115              SET CARD_CURRENT_BALANCE = CARD_CURRENT_BALANCE -
    116                                          :NEW.TR_AMOUNT
    117            WHERE CARD_ID = :NEW.CARD_ID;
    118             
    119           DBMS_OUTPUT.PUT_LINE('恭喜取款成功!');
    120         END IF;
    121       END IF;
    122   END CASE;
    123     
    124     EXCEPTION
    125 
    126   WHEN OTHERS THEN
    127        RAISE_APPLICATION_ERROR(-20003,'未知错误');
    128    ROLLBACK;
    129 END;
    130 
    131  --触发器 -------------------E
    132  --函数,存储过程--s
    133 -- 1.    创建函数:卡号随机生成,注意卡号的格式1010 3576 XXXX XXXX
    134 CREATE OR REPLACE FUNCTION USER_UID_AUTOMATION_ATM RETURN VARCHAR2 AS
    135   CARD_ID VARCHAR2(19) := '1010 3576 ';
    136 BEGIN
    137   CARD_ID := (CARD_ID, TO_CHAR(FLOOR(DBMS_RANDOM.VALUE * 10000)));
    138   CARD_ID := CONCAT(CARD_ID, ' ');
    139   CARD_ID := CONCAT(CARD_ID, TO_CHAR(FLOOR(DBMS_RANDOM.VALUE * 10000)));
    140   RETURN CARD_ID;
    141 END;
    142  SELECT USER_UID_AUTOMATION_ATM FROM DUAL;
    143  
    144  
    145 ---2. 创建开户的存储过程:注意卡号调用上面函数,开户过程包含插入信息到用户表及银行卡信息表
    146 CREATE OR REPLACE PROCEDURE OPEN_ACCOUNTS_ATM(PNAME      USER_ATM.U_NAME%TYPE, --用户名
    147                                               PCARD      USER_ATM.U_CARD_NUM%TYPE, --身份证号码
    148                                               PCONTACT   USER_ATM.U_CONTACT_NUM%TYPE, --联系电话
    149                                               PCOADDRESS USER_ATM.U_CONTACT_ADDRESS%TYPE, --联系地址
    150                                               PCARD_CU   VARCHAR2, --币种
    151                                               PCARD_ST   VARCHAR2, --存款类型
    152                                               PCARD_AM   NUMBER, --金额
    153                                               PCARD_PAW  VARCHAR2, --密码
    154                                               PRESULT    OUT VARCHAR2) AS
    155   NUM     NUMBER;
    156   USER_ID NUMBER;
    157 BEGIN
    158 --根据身份证号码判断用户表是否存在此用户
    159   SELECT COUNT(U_ID)
    160     INTO NUM
    161     FROM USER_ATM
    162    WHERE USER_ATM.U_CARD_NUM = PCARD;
    163   IF NUM = 0
    164   THEN
    165     --没有用户名,在用户信息表创建用户信息记录
    166     USER_ID := U_ID_SEQ.NEXTVAL;
    167     INSERT INTO USER_ATM
    168     VALUES
    169       (USER_ID, PNAME, PCARD, PCONTACT, PCOADDRESS);
    170   ELSE
    171     --有此用户,获取用户的id编号  --一个用户允许开多张卡
    172     SELECT U_ID
    173       INTO USER_ID
    174       FROM USER_ATM
    175      WHERE USER_ATM.U_CARD_NUM = PCARD;
    176   END IF;
    177     --在卡信息表添加记录
    178   INSERT INTO BANK_CARD_ATM
    179   VALUES
    180     (USER_UID_AUTOMATION_ATM, PCARD_CU, PCARD_ST, SYSDATE, PCARD_AM, PCARD_AM, PCARD_PAW, '', USER_ID);
    181   COMMIT;
    182   PRESULT := '开户成功!';
    183 EXCEPTION
    184   WHEN OTHERS THEN
    185     PRESULT := '未知错误';
    186     ROLLBACK;
    187 END;
    188 
    189 
    190   --3.  创建修改密码的存储过程
    191   CREATE OR REPLACE PROCEDURE PAW_UP_ATM(PCARDID BANK_CARD_ATM.CARD_ID%TYPE,
    192                                          PPWS    BANK_CARD_ATM.CARD_PASSWORD%TYPE,
    193                                          PRESULT OUT VARCHAR2) AS
    194   NUM NUMBER;
    195 BEGIN
    196   SELECT count(rownum)
    197     INTO NUM
    198     FROM BANK_CARD_ATM
    199    WHERE BANK_CARD_ATM.CARD_ID = PCARDID;     
    200      IF NUM=1 Then
    201   UPDATE BANK_CARD_ATM
    202      SET BANK_CARD_ATM.CARD_PASSWORD = PPWS
    203    WHERE CARD_ID = PCARDID;
    204   COMMIT;
    205        PRESULT := '密码修改成功!';
    206          ELSE PRESULT := '找不到数据';
    207          END IF;
    208          
    209 EXCEPTION
    210   WHEN OTHERS THEN
    211     PRESULT := '未知错误';
    212         ROLLBACK;
    213 END;
    214 --4.    创建挂失账号的存储过程
    215 CREATE OR REPLACE PROCEDURE RELO_UP_ATM(PCARDID BANK_CARD_ATM.CARD_ID%TYPE,
    216                                         PRESULT OUT VARCHAR2) AS
    217   NUM NUMBER;
    218 BEGIN
    219   SELECT count(rownum)
    220     INTO NUM
    221     FROM BANK_CARD_ATM
    222    WHERE BANK_CARD_ATM.CARD_ID = PCARDID;     
    223      IF NUM=1 Then
    224    UPDATE BANK_CARD_ATM
    225      SET BANK_CARD_ATM.CARD_REPORT_LOSS = ''
    226    WHERE CARD_ID = PCARDID;
    227   COMMIT;
    228     PRESULT := '挂失成功!';
    229          ELSE PRESULT := '找不到数据';
    230          END IF; 
    231 EXCEPTION
    232   WHEN OTHERS THEN
    233     PRESULT := '未知错误';
    234         ROLLBACK;
    235 END;
    236 
    237 --测试:
    238 select * FROM user_atm;
    239 select * FROM Bank_card_atm;
    240 SELECT * FROM TRANSACTION_INFORMATION_ATM;
    241 --执行开户的存储过程,
    242 DECLARE
    243 mess VARCHAR2(50);
    244 BEGIN
    245 OPEN_ACCOUNTS_ATM('小龙女','123421118901049999','18877572925','桃花岛','RMB','活期',800,'123456789',mess);
    246    dbms_output.put_line(mess);
    247 end;
    248 --执行修改密码的存储过程,
    249 DECLARE
    250   MESS VARCHAR2(50);
    251 BEGIN
    252   PAW_UP_ATM('1010 3576 6732 6309', 'huangrong', MESS);
    253   DBMS_OUTPUT.PUT_LINE(MESS);
    254 END;
    255 
    256 --执行挂失的存储过程
    257 DECLARE
    258   MESS VARCHAR2(50);
    259 BEGIN
    260   RELO_UP_ATM('1010 3576 6732 6309', MESS);
    261   DBMS_OUTPUT.PUT_LINE(MESS);
    262 END;
    263 
    264 --1.    创建支取和存入的存储过程,注意只需要操作交易表,而银行卡信息表的余额由上面步骤三中的触发器维护
    265 CREATE OR REPLACE PROCEDURE TRIN_IN_ATM(PCARDID BANK_CARD_ATM.CARD_ID%TYPE, --卡号
    266                                         PTYPE   VARCHAR2, --操作类型
    267                                         PAMOUNT NUMBER, --操作金额
    268                                         PREMARK VARCHAR2, --备注
    269                                         PRESULT OUT VARCHAR2) AS
    270   NUM NUMBER;
    271 BEGIN
    272     INSERT INTO TRANSACTION_INFORMATION_ATM
    273     VALUES
    274       (SYSDATE, PCARDID, PTYPE, PAMOUNT, PREMARK);
    275     COMMIT;
    276     PRESULT :=  '成功';
    277 EXCEPTION
    278   WHEN OTHERS THEN
    279     PRESULT := '未知错误';
    280     ROLLBACK;
    281 END;
    282 --2.    创建查询余额存储过程
    283 CREATE OR REPLACE PROCEDURE BALANCE_ENQUIRY_ATM(PCARDID BANK_CARD_ATM.CARD_ID%TYPE,
    284                                                 PRESULT OUT VARCHAR2) AS
    285   NUM NUMBER;
    286 BEGIN
    287   SELECT BANK_CARD_ATM.CARD_CURRENT_BALANCE
    288     INTO NUM
    289     FROM BANK_CARD_ATM
    290    WHERE BANK_CARD_ATM.CARD_ID = PCARDID;
    291   PRESULT := CONCAT('当前余额为:' ,to_char(NUM) );
    292 EXCEPTION
    293   WHEN NO_DATA_FOUND THEN
    294     PRESULT := '找不到数据';
    295   WHEN OTHERS THEN
    296     PRESULT := '未知错误';
    297 END;
    298 --3.    创建转账存储过程,注意:判断要转账及要转入的账户是否都存在,转账金额是否充足,发生异常交易失败要回滚
    299 CREATE OR REPLACE PROCEDURE TRANSFER_ATM(PCARDID1 BANK_CARD_ATM.CARD_ID%TYPE, --转出账号
    300                                          PCARDID2 BANK_CARD_ATM.CARD_ID%TYPE, --收入账号
    301                                          PNUM     NUMBER, --转账金额
    302                                          PRESULT  OUT VARCHAR2) AS
    303   NUM_ME NUMBER;
    304   NUM    NUMBER;
    305 
    306 BEGIN
    307   SELECT BANK_CARD_ATM.CARD_CURRENT_BALANCE
    308     INTO NUM_ME
    309     FROM BANK_CARD_ATM
    310    WHERE BANK_CARD_ATM.CARD_ID = PCARDID1;
    311   SELECT COUNT(CARD_ID)
    312     INTO NUM
    313     FROM BANK_CARD_ATM
    314    WHERE BANK_CARD_ATM.CARD_ID = PCARDID2;
    315   IF NUM = 0
    316   THEN
    317     PRESULT := CONCAT('没有查询到账号为:' ,CONCAT( PCARDID2 , '的用户'));
    318   ELSIF NUM_ME <= PNUM
    319   THEN
    320     PRESULT := '你的余额不足此操作!';
    321   ELSE
    322   INSERT INTO TRANSACTION_INFORMATION_ATM
    323   VALUES
    324     (SYSDATE, PCARDID1, '支出', PNUM, '转账至'||PCARDID2);
    325   INSERT INTO TRANSACTION_INFORMATION_ATM
    326   VALUES
    327     (SYSDATE, PCARDID2, '存入', PNUM, PCARDID1||'转入');  
    328     COMMIT;
    329             PRESULT :=  '成功';
    330   END IF;
    331 EXCEPTION
    332   WHEN NO_DATA_FOUND THEN
    333     PRESULT := '找不到数据';
    334     ROLLBACK;
    335   WHEN OTHERS THEN
    336     PRESULT := '未知错误';
    337     ROLLBACK;
    338 END;
    339 --4.    创建汇总存储过程(对于银行来说流通余额=所有存入-所有取出)(对于银行来说盈利结算=所有存入*0.003-所有支取*0.008),
    340 CREATE OR REPLACE PROCEDURE COLLECTION_BC_ATM(PRESULT OUT VARCHAR2) AS
    341   DEPOSIT     NUMBER;
    342   EXPENDITURE NUMBER;
    343 BEGIN
    344   SELECT SUM(TR_AMOUNT)
    345     INTO DEPOSIT
    346     FROM TRANSACTION_INFORMATION_ATM
    347    WHERE TRANSACTION_INFORMATION_ATM.TR_TYPE = '存入';
    348   SELECT SUM(TR_AMOUNT)
    349     INTO EXPENDITURE
    350     FROM TRANSACTION_INFORMATION_ATM
    351    WHERE TRANSACTION_INFORMATION_ATM.TR_TYPE = '支出';
    352   PRESULT := CONCAT(CONCAT('流通余额为:', TO_CHAR(DEPOSIT - EXPENDITURE)),
    353                     CONCAT('    盈利为:',
    354                            TO_CHAR(DEPOSIT * 0.003 - EXPENDITURE * 0.008)));
    355 EXCEPTION
    356   WHEN NO_DATA_FOUND THEN
    357     PRESULT := '找不到数据';
    358   WHEN OTHERS THEN
    359     PRESULT := '未知错误';
    360 END;
    361   --5.  创建销户存储过程,注意销户要删除用户信息表,银行卡信息表,交易信息表中于之相关的所有记录
    362 CREATE OR REPLACE PROCEDURE ACCOUNT_CANCE_ATM(PCARDNUM USER_ATM.U_CARD_NUM%TYPE,
    363                                               PCARDID1 BANK_CARD_ATM.CARD_ID%TYPE,
    364                                               PRESULT  OUT VARCHAR2) AS
    365   NUM NUMBER;
    366 BEGIN
    367   SELECT COUNT(U_ID)
    368     INTO NUM
    369     FROM BANK_CARD_ATM
    370    WHERE BANK_CARD_ATM.CARD_ID = PCARDID1
    371      AND U_ID = (SELECT U_ID
    372                    FROM USER_ATM
    373                   WHERE USER_ATM.U_CARD_NUM = PCARDNUM);
    374   IF NUM = 1
    375   THEN
    376     DELETE FROM BANK_CARD_ATM
    377      WHERE BANK_CARD_ATM.CARD_ID = PCARDID1;
    378          COMMIT;
    379   END IF;
    380   SELECT COUNT(U_ID)
    381     INTO NUM
    382     FROM BANK_CARD_ATM
    383    WHERE BANK_CARD_ATM.U_ID =
    384          (SELECT U_ID
    385             FROM USER_ATM
    386            WHERE USER_ATM.U_CARD_NUM = PCARDNUM);
    387   IF NUM = 0
    388   THEN
    389     DELETE FROM USER_ATM
    390      WHERE USER_ATM.U_CARD_NUM = PCARDNUM;
    391                   COMMIT;
    392   END IF;
    393   PRESULT := '成功';
    394 EXCEPTION
    395   WHEN OTHERS THEN
    396     PRESULT := '未知错误';
    397 END;
    398 --测试:
    399 --执行取钱和存钱的存储过程,
    400 DECLARE
    401   MESS VARCHAR2(50);
    402 BEGIN
    403   TRIN_IN_ATM('1010 3576 6732 6309', '支出',1000,'11', MESS);
    404   DBMS_OUTPUT.PUT_LINE(MESS);
    405 END;
    406    
    407 --执行查询余额的存储过程,
    408 DECLARE
    409   MESS VARCHAR2(50);
    410 BEGIN
    411  BALANCE_ENQUIRY_ATM('1010 3576 6732 6309', MESS);
    412   DBMS_OUTPUT.PUT_LINE(MESS);
    413 END;
    414 
    415 --执行转账的存储过程,
    416 DECLARE
    417   MESS VARCHAR2(50);
    418 BEGIN
    419  TRANSFER_ATM('1010 3576 4000 0000','1010 3576 4000 5800',50, MESS);
    420   DBMS_OUTPUT.PUT_LINE(MESS);
    421 END;
    422 
    423 --执行汇总的存储过程
    424 DECLARE
    425   MESS VARCHAR2(50);
    426 BEGIN
    427  COLLECTION_BC_ATM( MESS);
    428   DBMS_OUTPUT.PUT_LINE(MESS);
    429 END;
    430 
    431 --执行销户的存储过程
    432 DECLARE
    433   MESS VARCHAR2(50);
    434 BEGIN
    435  account_cance_ATM('450921199601042456','1010 3576 4000 5856', MESS);
    436   DBMS_OUTPUT.PUT_LINE(MESS);
    437 END;
    438 select * FROM user_atm;
    439 select * FROM Bank_card_atm;
    440 SELECT * FROM TRANSACTION_INFORMATION_ATM;
    441 --函数--E
  • 相关阅读:
    网络基础之网络协议篇
    JVM-07-执行引擎
    JVM-06-对象实例化、内存布局、访问定位以及直接内存
    JVM-05-方法区
    JVM-04-堆
    JVM-03-本地方法接口和本地方法栈
    JVM-02-程序计数器 虚拟机栈
    JVM-01-类加载子系统
    JVM-00-引言
    swagger
  • 原文地址:https://www.cnblogs.com/sylwh/p/7596803.html
Copyright © 2011-2022 走看看