2016-04-02 4 views
-4

Ich habe ein Problem mit meinem Auslöser (ich bin neu mit Oracle) Mit diesem Auslöser möchte ich, wenn ein neuer Vertrag einfügen und diese Verträge haben ein start_date, das vor diesem end_date des anderen Vertrags dieses Benutzers ist , der Trigger muss das alte end_date in das start_date des neuen Vertrags ändern.Lösung dieses einfachen Auslösers

Hier ist mein Code:

CREATE OR REPLACE TRIGGER Date_contracts 
    BEFORE INSERT OR UPDATE OF START_DATE ON CONTRACTS 
    FOR EACH ROW 
    BEGIN 
     IF :NEW.START_DATE < (SELECT DISTINCT END_DATE FROM CONTRACTS WHERE SSN = NEW.SSN) 
     THEN OLD.END_DATE := NEW.START_DATE; 
     END IF; 
    END; 
    /

und SQL developres sagt, dass Unterabfrage in diesem Zusammenhang nicht erlaubt. Ich bin sicher, dass das zu reparieren ist, aber ich kann es nicht lösen, weil mein Niveau so niedrig ist. Ich hoffe, dass Sie mir helfen :) Danke

+0

Es ist eine Warnung, dass ** Es zeigt möglicherweise mehr als 1 Datensatz zurückgeben * * –

+0

Sie haben ein grundlegendes Missverständnis der Auslöser, wenn Sie denken, dass Sie das alte Anfangsdatum ändern können. –

Antwort

0

1.

DISTINCT END_DATE aus Verträgen SELECT WHERE SSN = NEW.SSN ein oder mehrere Datensatz zurückgeben kann, die proble verursachen kann.

2.

aus derselben Tabelle in Trigger Auswählen, auf dem Trigger erzeugt wird Problem verursachen kann.

Dank

+0

Ja, das war das Problem :) Danke – Nogus

0

Reed über Using Triggers
Sie kippt gesetzt: OLD. Werte - das ist nur lesen Wert (: alte Werte Werte der aktualisierten Zeile vor der Aktualisierung) ... Sie wahrscheinlich tun versuchen, diese

update CONTRACTS set END_DATE = :NEW.START_DATE 
where SSN = :NEW.SSN and END_DATE < :NEW.START_DATE and someid <> nvl(:OLD.someid, :NEW.someid) 
Verwandte Themen