2017-04-12 3 views
0

Ich bin neu in SQL und ich versuche, Trigger herauszufinden. Ich brauche einen Auslöser zu schreiben, die drei Tabellen beinhalten, keine Sorge, es nur durch eine der Tabellen ausgelöst wird ...Auslöser mit mehreren Tabellen 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) 
); 

Also, wenn der Kredit-Score (Kreditscoring) von der Kundentabelle aktualisiert wird, i Ich möchte den Kredittyp (LOANTYPE) in der Kreditdetaildatei sehen. Wenn der Kredittyp eine 1 oder 2 ist, möchte ich den Kreditzins in der Kreditdetaildatei aktualisieren. Der Kreditzins wird aktualisiert, indem festgestellt wird, wo der benutzerdefinierte Kreditscore in der Score-Konversionstabelle liegt (Creditscore in der Kundentabelle). Wenn er zwischen einem bestimmten Min- und Max-Score in der Konvertierungstabellentabelle liegt, wird die entsprechende Basisratenanpassung zu einer Basis hinzugefügt Rate von 3%.

Ich bin unklar, wie alle diese Tabellen erhalten in den Auslöser zu interagieren,

Wenn mir jemand in einfacher Sprache helfen könnte oder mich auf eine große Ressource verweisen ich es schätzen würde.

+0

Welche Probleme haben Sie mit dem oben genannten Code? –

Antwort

2

Das folgende Beispiel kann einen Ausgangspunkt für Sie bieten.
Dieser Trigger wird die LOANDETAILS, wenn der Kredit-Typ von einem einstellbaren Typ ist, durch die Konvertierung in SCORECONVERSIONCHART, nur aktualisiert, wenn der Kredit-Score aktualisiert wird.

Zuerst einige Testdaten hinzufügen:

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; 

Dann wird die TRIGGER bearbeiten Das ursprüngliche Beispiel erstellen vorausgesetzt es war nur ein Darlehen pro Kunde. Aktualisiert, um mehrere Darlehen pro Kunde zu verwalten.

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

Dann testen:

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

Dann eine Nicht-Kredit-Score Attributaktualisierung:

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

dann das Kredit-Scores aktualisieren. Frodos Darlehen ändert sich (seine Darlehensart ist wählbar) auf 3% + die Anpassung der Score-Conversion-Karte um 3%, aber Chewies bewegt sich überhaupt nicht.

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

Wenn die Darlehenstypen Zahlen sind, würde ich vorschlagen, sie als Zahlen zu notieren.

+0

Vielen Dank für Ihre gründliche Antwort, Es ist aufschlussreich wie ein Noob die Abfrage in Bezug auf die eingestellte Rate verwendet zu sehen. Die meisten Dokumente, die ich gelesen habe, gehen nicht so sehr ins Detail. – Mike

+0

Danke @Mike. Wenn etwas Ungewöhnliches mit diesem Vorwärtskommen oder irgendetwas, das ich klären kann, aufkommt, lassen Sie es mich wissen – alexgibbs

0

Sie können etwas wie unten tun.

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

Jetzt mit der oben genannten Unterabfrage erhalten Sie Basisrate dieser berechtigten Kunden. Sie können diese Rate gemäß Ihrer Anforderung ändern.

+0

Danke Rams. Es ist schön, eine andere Lösung zu sehen. Ich habe die andere Lösung überprüft, weil weniger Code verwendet wurde. Trotzdem war es lehrreich, Ihre Lösung zu sehen. – Mike