码迷,mamicode.com
首页 > 数据库 > 详细

Oracle项目实战之ATM

时间:2017-09-26 16:04:23      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:random   osi   序列   regexp   sum   存储类型   姓名   result   检查   

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

 

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

 

用户表:用户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) DEFAULTRMB 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

 

 

 

Oracle项目实战之ATM

标签:random   osi   序列   regexp   sum   存储类型   姓名   result   检查   

原文地址:http://www.cnblogs.com/sylwh/p/7596803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!