廢話不多說,直接上需求:
步驟一:創建表空間,創建用戶【用戶默認操作新建的表空間】,創建表,並為各表添加約束
用戶表:用戶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
