涉及多个表的触发器Oracle、PL/SQL
我是SQL新手,我正在尝试找出触发器。我需要编写一个涉及3个表的触发器,不要担心它只由其中一个表触发涉及多个表的触发器Oracle、PL/SQL,sql,oracle,plsql,Sql,Oracle,Plsql,我是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 NU
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)
);
因此,当更新customer表中的信用评分(creditscore)时,我想查看loan details表中的贷款类型(LoantType)。如果贷款类型是1或2,我想更新贷款明细表中的贷款利率。通过查看分数转换图表表中自定义信用分数的下降位置(客户表中的creditscore)更新贷款利率-如果它在转换图表表中的给定最低和最高分数之间,则相应的基准利率调整将添加到3%的基准利率
我不清楚如何让所有这些表在触发器中交互
如果有人能用通俗易懂的语言帮助我或给我指出一个很好的资源,我将不胜感激。下面的例子可能会为您提供一个起点。
如果贷款类型为可调整类型,则只有在信用评分更新时,此触发器才会通过
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;
然后创建触发器
编辑原始示例,假设每个客户只有一笔贷款。更新以处理每个客户的多笔贷款
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%,但丘伊的贷款根本没有变化
UPDATE CUSTOMERS SET CREDITSCORE = 600;
SELECT CUSTID, LOANTYPE, RATE FROM LOANDETAILS;
CUSTID LOANTYPE RATE
00000000 1 6
00000001 3 4.2
如果贷款类型是数字,我建议将其记录为数字。以下示例可能为您提供一个起点。
如果贷款类型为可调整类型,则只有在信用评分更新时,此触发器才会通过
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;
然后创建触发器
编辑原始示例,假设每个客户只有一笔贷款。更新以处理每个客户的多笔贷款
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%,但丘伊的贷款根本没有变化
UPDATE CUSTOMERS SET CREDITSCORE = 600;
SELECT CUSTID, LOANTYPE, RATE FROM LOANDETAILS;
CUSTID LOANTYPE RATE
00000000 1 6
00000001 3 4.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;
/
现在,通过上面的子查询,u将获得符合条件的客户的基准利率。您可以根据您的要求更改费率。您可以执行以下操作
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;
/
现在,通过上面的子查询,u将获得符合条件的客户的基准利率。您可以根据您的要求更改该费率。您对上述代码有什么问题?您对上述代码有什么问题?谢谢您的全面回答,看到与设置费率相关的查询是一件很有启发性的事情。我读过的大部分文档都没有详细介绍,谢谢@Mike。如果有任何不寻常的事情发生,或者我可以澄清的事情,请让我知道。谢谢你的全面回答。作为一个noob,看到与设定利率相关的查询是很有启发性的。我读过的大部分文档都没有详细介绍,谢谢@Mike。如果有什么不寻常的事情发生,或者有什么我可以澄清的,请告诉我,谢谢你。很高兴看到另一个解决方案。我检查了另一个解决方案,因为它使用的代码更少。尽管如此,看到你的解决方案还是很有启发性的。谢谢你。很高兴看到另一个解决方案。我检查了另一个解决方案,因为它使用的代码更少。尽管如此,看到你的解决方案还是很有启发性的。