【问题标题】:Trigger that involves multiple tables Oracle, PL/SQL涉及多表Oracle、PL/SQL的触发器
【发布时间】:2017-09-08 22:05:14
【问题描述】:

我是 SQL 新手,我正在尝试找出触发器。我需要写一个涉及3个表的触发器,不用担心它只被其中一个表触发...

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,我想更新贷款详细信息表中的贷款利率。通过查看分数转换表中的自定义信用评分(客户表中的信用评分)来更新贷款利率 - 如果它落在转换表中给定的最小和最大分数之间,则将适当的 baserateadjustment 添加到基础3%。

我不清楚如何让所有这些表在触发器中进行交互,

如果有人可以用通俗易懂的语言帮助我或向我指出一个很好的资源,我将不胜感激。

【问题讨论】:

  • 上述代码有什么问题?

标签: sql oracle plsql


【解决方案1】:

以下示例可能会为您提供一个起点。
此触发器将有条件地更新LOANDETAILS,如果贷款类型为可调整类型,则仅在更新信用评分时通过SCORECONVERSIONCHART 中的转换。

首先,添加一些测试数据:

INSERT INTO CUSTOMERS VALUES ('00000000','Frodo','Baggins',null,null,null,'frodo@hobbiton.com',123,750);
INSERT INTO CUSTOMERS VALUES ('00000001','Chewbacca','?',null,null,null,'chewie@hoth.com',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   

然后更新信用评分。 Frodo 的贷款更改(他的贷款类型符合条件)为 3% + scoreconversionchart 调整 3%,但 Chewie 的贷款完全没有变化。

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

如果贷款类型是数字,我建议将它们记录为数字。

【讨论】:

  • 感谢您的详尽回答,作为菜鸟,看到与设置费率相关的查询很有启发性。我读过的大部分文档都没有这么详细
  • 谢谢@Mike。如果有任何不寻常的事情发生,或者我可以澄清的任何事情,请告诉我
【解决方案2】:

您可以执行以下操作。

    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;
        /

现在使用上面的子查询,您将获得符合条件的客户的基本比率。您可以根据您的要求更改该费率。

【讨论】:

  • 谢谢公羊。很高兴看到另一个解决方案。我检查了另一个解决方案,因为它使用的代码更少。尽管如此,看到您的解决方案还是很有启发性的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多