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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM