2017-04-12 79 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