Oracle项目实战之ATM
Posted 站在西瓜上的猪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle项目实战之ATM相关的知识,希望对你有一定的参考价值。
废话不多说,直接上需求:
步骤一:创建表空间,创建用户【用户默认操作新建的表空间】,创建表,并为各表添加约束
用户表:用户ID,姓名,身份证,联系电话,联系地址
要求:
- 用户ID为主键
- 身份证号码唯一,15或18位
- 为用户ID创建序列,用于用户ID自增
银行卡信息表:卡号,币种(人民币),存储类型(定期,活期),开户时间,开户金额,当前账目余额,密码,是否挂失,用户的ID
要求:
- 卡号主键,卡号必须是0-9的数字,格式xxxx xxxx xxxx xxxx以1010 3576开头
- 存储类型只能是下面三种之一:活期,定期,活定两便
- 开户金额必须大于1元
- 密码必须大于6位
- 是否挂失只能是下面两种之一:是,否
- 用户的ID是外键,关联用户表的主键。
- 币种默认”RMB”
- 开户时间默认当前时间
- 密码默认888888
- 是否挂失默认:否
- 根据卡号创建银行卡信息表的索引优化表查询。
交易信息表:交易日期,卡号,交易类型,交易金额,备注
要求:
- 卡号为外键,关联银行卡信息表主键
- 交易类型只能是下面两种之一:存入,支取
- 交易金额必须大于0
- 交易时间默认为当前时间
注意:对于三张表都要创建公有同义词,便于以后的查询。
测试:分别添加两条用户表,银行卡信息表
步骤二:创建视图,要求如下:
1.创建 用户表表视图
2.创建银行卡信息表视图
3.创建交易信息表视图
4.创建查询挂失的客户信息视图
5.创建 查询本周开户的卡号 显示相关信息视图
6.创建 查询本月交易金额最高的卡号 的视图
测试:分别测试上面个视图是否显示正常
步骤三:创建触发器,要求如下:
1.不允许修改卡号:当更新的是银行卡信息表的卡号时提示“此列不允许修改”
2.当交易信息表有插入或者修改记录,银行卡信息表跟随改变:如交易信息表新增一条支取,那么对应的银行信息卡余额应该减少对应支取的金额。同理如交易信息表新增一条存入,那么对应的银行信息卡余额应该增加对应存入的金额。注意:如果支取先判断余额,不足则提示。如交易成功打印恭喜信息。
测试:分别针对交易信息表做支取和存入的操作。
步骤四:创建针对用户信息的程序包及程序包主体内容
- 创建函数:卡号随机生成,注意卡号的格式1010 3576 XXXX XXXX
- 创建开户的存储过程:注意卡号调用上面函数,开户过程包含插入信息到用户表及银行卡信息表
- 创建修改密码的存储过程
- 创建挂失账号的存储过程
测试:执行开户的存储过程,执行修改密码的存储过程,执行挂失的存储过程
步骤五:创建针对银行卡信息表的程序包及程序包主体内容
- 创建支取和存入的存储过程,注意只需要操作交易表,而银行卡信息表的余额由上面步骤三中的触发器维护
- 创建查询余额存储过程
- 创建转账存储过程,注意:判断要转账及要转入的账户是否都存在,转账金额是否充足,发生异常交易失败要回滚
- 创建汇总存储过程(对于银行来说流通余额=所有存入-所有取出)(对于银行来说盈利结算=所有存入*0.003-所有支取*0.008),
- 创建销户存储过程,注意销户要删除用户信息表,银行卡信息表,交易信息表中于之相关的所有记录
测试:执行取钱和存钱的存储过程,执行查询余额的存储过程,执行转账的存储过程,执行汇总的存储过程,执行销户的存储过程
实现:
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
以上是关于Oracle项目实战之ATM的主要内容,如果未能解决你的问题,请参考以下文章
Oracle12.2 RAC集群管理之增加删除节点_Oracle12cR2视频教程(项目实战之六)
Oracle12.2 RAC集群管理之IP地址修改_Oracle12cR2视频教程(项目实战之七)
Oracle数据库12cR2(项目实战之二):Linux系统安装Oracle12.2