2017-04-12 78 views
0

我是SQL新手,我試圖找出觸發器。我需要編寫一個涉及3個表的觸發器,不用擔心它僅由表中的一個觸發...涉及多個表的觸發器Oracle,PL/SQL

CREATE TABLE CUSTOMERS 
(CUSTID CHAR(8) constraint customers_pk primary key, 
CREDITSCORE NUMBER(5,2) 

CREATE TABLE LOANDETAILS 
(LOANNO VARCHAR2(11) primary key, 
CUSTID CHAR(8), 
LOANSTATUSCODE NUMBER(3,0), 
RATE NUMBER(5,2), 

CREATE TABLE SCORECONVERSIONCHART 
(SCOREBAND VARCHAR2(1) constraint scorecc_pk primary key, 
MINSCORE NUMBER(3,0), 
MAXSCORE NUMBER(3,0), 
BASERATEADJUSTMENT NUMBER(4,2) 
); 

所以,當從客戶表中的信用評分(CreditScore等)被更新,我想要查看貸款細節表中的貸款類型(LOANTYPE)。如果貸款類型是1或2,我想更新貸款詳細信息表中的貸款利率。通過在分數轉換圖表中查看自定義信用評分下降的位置(客戶表格中的信用分數)來更新貸款利率 - 如果它落入轉換圖表中給定的最小和最大分數之間,則將適當的基準調整量添加到基準率3%。

我不清楚如何獲得這些表格來在觸發交互,

如果有人可以幫助我用通俗易懂的語言或指向我一個很好的資源,我將不勝感激。

+0

你對上述代碼有什麼問題? –

回答

2

以下示例可能會爲您提供一個開始位置。
如果貸款類型屬於可調整類型,則此觸發器將有條件地更新LOANDETAILS,僅在信用分數更新後,通過SCORECONVERSIONCHART轉換。

首先,添加一些測試數據:

INSERT INTO CUSTOMERS VALUES ('00000000','Frodo','Baggins',null,null,null,'[email protected]',123,750); 
INSERT INTO CUSTOMERS VALUES ('00000001','Chewbacca','?',null,null,null,'[email protected]',456,775); 


INSERT INTO LOANDETAILS VALUES ('A',NULL,'00000000','1',NULL,NULL,7.2,NULL,NULL); 
INSERT INTO LOANDETAILS VALUES ('B',NULL,'00000001','3',NULL,NULL,4.2,NULL,NULL); 

INSERT INTO SCORECONVERSIONCHART VALUES ('X',500,599,22); 
INSERT INTO SCORECONVERSIONCHART VALUES ('Y',600,699,3); 
INSERT INTO SCORECONVERSIONCHART VALUES ('Z',700,799,1); 
COMMIT; 

然後創建TRIGGER 編輯假定原來的例子有每個客戶只有一個貸款。更新後處理每個客戶的多筆貸款。

CREATE OR REPLACE TRIGGER Q2 
AFTER UPDATE OF CREDITSCORE 
    ON CUSTOMERS 
FOR EACH ROW 
    DECLARE 
    V_LOAN_TYPE NUMBER; 
    BEGIN 
     UPDATE LOANDETAILS 
     SET RATE = (SELECT SCORECONVERSIONCHART.BASERATEADJUSTMENT + 3 
        FROM SCORECONVERSIONCHART 
        WHERE :NEW.CREDITSCORE BETWEEN SCORECONVERSIONCHART.MINSCORE 
        AND SCORECONVERSIONCHART.MAXSCORE) 
     WHERE LOANDETAILS.CUSTID = :NEW.CUSTID 
     AND LOANDETAILS.LOANTYPE IN ('1','2'); 
END; 
/

然後,測試它:

SELECT CUSTID, LOANTYPE, RATE FROM LOANDETAILS; 
CUSTID LOANTYPE RATE 
00000000 1   7.2 
00000001 3   4.2 

然後,更新非信用得分屬性:

UPDATE CUSTOMERS SET STATE = 'WI'; 
SELECT CUSTID, LOANTYPE, RATE FROM LOANDETAILS; 
CUSTID LOANTYPE RATE 
00000000 1   7.2 
00000001 3   4.2 

然後更新信用分數。佛羅多的貸款變化(他的貸款類型是合格的)至3%+分數轉換圖調整爲3%,但Chewie's根本不動。

UPDATE CUSTOMERS SET CREDITSCORE = 600; 
SELECT CUSTID, LOANTYPE, RATE FROM LOANDETAILS; 
CUSTID LOANTYPE RATE 
00000000 1   6  
00000001 3   4.2 

如果貸款類型是數字,我建議將它們記錄爲數字。

+0

非常感謝您的詳細解答,作爲一個小菜鳥,您可以看到與設置速度相關的查詢。我讀過的大多數文檔都沒有詳細說明 – Mike

+0

謝謝@Mike。如果有任何不尋常的事情出現這個未來或任何我可以澄清只是讓我知道 – alexgibbs

0

你可以做下面的事情。

CREATE OR REPLACE TRIGGER trig 
     AFTER UPDATE OF CREDITSCORE 
     ON CUSTOMERS 
     FOR EACH ROW 
     DECLARE 
     temp_RATE LOANDETAILS.RATE%type 
     temp_adj SCORECONVERSIONCHART.BASERATEADJUSTMENT%type; 
     BEGIN 
     UPDATE LOANDETAILS 
     SET RATE = RATE + 0.03* (select s.BASERATEADJUSTMENT from customer c join loandetails l on c.custid=l.custid cross join SCORECONVERSIONCHART s where new.crediscore between s.minscore and s.maxscore and l.LOANTYPE in (1,2) and c.custid=new.custid) 
WHERE CUSTID= (select c.custid from customer c join loandetails l on c.custid=l.custid cross join SCORECONVERSIONCHART s where new.crediscore between s.minscore and s.maxscore and l.LOANTYPE in (1,2) and c.custid=new.custid) 

     END IF; 
     END; 
     /

現在,通過上述子查詢,您將得到符合條件的客戶的基礎。您可以根據您的要求更改該費率。

+0

謝謝公羊。很高興看到另一種解決方案。我檢查了其他解決方案,因爲它使用的代碼較少。儘管如此,看到你的解決方案是有益的。 – Mike