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
时间: 2024-08-02 01:44:08

Oracle项目实战之ATM的相关文章

【java项目实战】dom4j解析xml文件,连接Oracle数据库

简介 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方,我们还是看一下官方给出的解释.如下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT等语言的库.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP等编程标准. 特点 dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用的特点,同时它也是一个开放源代码的软件.如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例

Oracle数据库12cR2(项目实战之一):在Windows上安装Oracle12.2

oracle数据库12cR2(项目实战之二):linux系统安装Oracle12.2 一.课程主题: 风哥Oracle数据库教程12cR2(项目实战之二):在linux操作系统安装Oracle12.2. 二.项目需求: 某单位新版HR人力资源系统最近上线,需要在Linux系统上安装一套Oracle12cR2数据库,并创建数据库,提供给业务系统使用. 三.实施步骤: 2.1.Oracle数据库12cR2 for Linux项目介绍与调研 2.2.Oracle数据库12cR2 for Linux实施

Oracle数据库12cR2(项目实战之二):Linux系统安装Oracle12.2

oracle数据库12cR2(项目实战之二):linux系统安装Oracle12.2 一.课程主题: 风哥Oracle数据库教程12cR2(项目实战之二):在linux操作系统安装Oracle12.2. 二.项目需求: 某单位新版HR人力资源系统最近上线,需要在Linux系统上安装一套Oracle12cR2数据库,并创建数据库,提供给业务系统使用. 三.实施步骤: 2.1.Oracle数据库12cR2 for Linux项目介绍与调研 2.2.Oracle数据库12cR2 for Linux实施

【无私分享:ASP.NET CORE 项目实战(第十二章)】添加对SqlServer、MySql、Oracle的支持

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 增加对多数据库的支持,并不是意味着同时对多种数据库操作,当然,后面,我们会尝试同时对多种数据库操作,这可能需要多个上下文,暂且不论.分布式数据库,我们采用的是阿里云的Mycat,这个后面会更新出来.我们今天的场景是:我们的项目可能是在windows上开发的使用的是SqlServer,我们要发布到linux上,SqlServer 2017 据说是支持liunx的,但是还没出... 当然不是说 SqlServer 就不能装在l

Linux系统Oracle12.2 RAC集群实施维护_Oracle数据库12cR2(项目实战之五)

课程目标 风哥Oracle数据库教程12cR2(项目实战系列)之五:Linux系统上Oracle 12.2 RAC实施与基本维护,包括系统安装与环境配置.ASM存储配置.Oracle 12cR2 RAC集群软件安装.RAC数据库软件安装.RAC数据库创建.RAC集群日常维护.RAC集群测试.RAC归档配置 适用人群 IT技术人员,IT初级工程师,系统管理员,网络管理员,主机工程师,数据库工程师 课程简介 课程介绍 Linux系统Oracle RAC 12c R2数据库安装(一体机集群项目)_风哥

【java项目实战】Servlet详解以及Servlet编写登陆页面(二)

Servlet是Sun公司提供的一门用于开发动态web网页的技术.Sun公司在API中提供了一个servlet接口,我们如果想使用java程序开发一个动态的web网页,只需要实现servelet接口,并把类部署到web服务器上就可以运行了. 到底什么是Servlet呢? 通俗一点,只要是实现了servlet接口的java程序,均称Servlet.Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小

java oracle,项目 企业级

开发快报: 页面打印功能,websocket 强制下线功能,玩转websocket技术  [金牌]获取[下载地址]   QQ: 313596790A 代码生成器(开发利器);     增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都

Oracle12.2 RAC集群管理之IP地址修改_Oracle12cR2视频教程(项目实战之七)

一.课程主题 风哥Oracle数据库教程12cR2(项目实战之七):基于Linux操作系统的Oracle12.2 RAC集群的管理之修改IP地址(public ip,vip ip,scan ip,private ip). Oracle12.2 RAC集群管理之IP地址修改_Oracle12cR2视频教程(项目实战之七) http://edu.51cto.com/course/10244.html 二.项目需求 根据业务的需求,XXX客户需要由原来的临时环境的RAC IP改为生产环境的RAC IP

Oracle12.2 RAC集群管理之增加删除节点_Oracle12cR2视频教程(项目实战之六)

一.课程主题 风哥Oracle数据库教程12cR2(项目实战之六):基于Linux操作系统的Oracle12.2 RAC集群的管理之增加删除节点(rac node add,rac node delete). Oracle12.2 RAC集群管理之增加删除节点_Oracle12cR2视频教程(项目实战之六) http://edu.51cto.com/course/10245.html 二.项目需求 由于业务需求,需要在原有一套ERP核心系统的RAC集群中增加或删除一个节点. 三.实施步骤 01.O