Trigger für nur geänderte Werte
Sagen wir 3 Datensätze in Tabelle: orig_tab
---------------------------------------------
| PK | Name | Address | Postal Code |
---------------------------------------------
| 1 | AA | Street1 | 11111 |
| 2 | BB | Street2 | 22222 |
| 3 | CC | Street3 | 33333 |
---------------------------------------------
Nun die Daten geändert werden:
---------------------------------------------
| PK | Name | Address | Postal Code |
---------------------------------------------
| 1 | AA | Street1 | 11111 |
| 2 | BB | Street2 | 44444 |
| 3 | CC | Dtreet7 | 33333 |
---------------------------------------------
Was der Kunde will, ist der update-records und nur die aktualisierten Spalten (ja, ich weiß, es macht keinen Sinn, aber Sie nutzen einige alte system aus den 1970er Jahren, und Sie wollen, um einige logging etc.). So sind die reporting-Tabelle sollte wie folgt sein:
---------------------------------------------
| PK | Name | Address | Postal Code |
---------------------------------------------
| 2 | | | 44444 |
| 3 | | Dtreet7 | |
---------------------------------------------
Das, was ich versucht habe:
CREATE OR REPLACE TRIGGER vr_reporting_trigger
AFTER UPDATE ON orig_tab
FOR EACH ROW
BEGIN
IF inserting THEN
INSERT INTO rep_tab(pk, name, address, code)
SELECT :new.pk, :new.name, :new.address, :new,code FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM rep_tab WHERE pk = :new.pk);
UPDATE rep_tab t SET t.name = :new.name, t.address = :new.address, t.code = :new.code
WHERE t.pk = :new.pk;
ELSIF updating THEN
IF :new.pk <> :old.pk THEN
UPDATE rep_tab t
SET t.name = :new.name, t.address = :new.address, t.code =: new.code
WHERE t.pk = :old.pk ;
END IF;
MERGE INTO rep_tab d
USING DUAL ON (d.pk = :old.pk)
WHEN MATCHED THEN
UPDATE SET d.name = :new.name, d.address = :new.address, d.code =: new.code
WHEN NOT MATCHED THEN
INSERT (d.pk,d.name, d.address, d.code) VALUES (:new.pk,:new.name, new.address, new.code);
END IF;
END;
mit dieser Lösung habe ich bekommen:
---------------------------------------------
| PK | Name | Address | Postal Code |
---------------------------------------------
| 2 | BB | Street2 | 44444 |
| 3 | CC | Dtreet7 | 33333 |
---------------------------------------------
Ich weiß, dass es irgendwo im insert-claus, wenn Update-statement, aber ich kann nicht herausfinden, wie diese claus geändert wie pro meine Anforderung. Jede Anregung?
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese benötigen Sie:
Vom Oracle-Dokumentation(9i)
11gR2 Dokumentation
Trigger für nur geänderte Werte.
Als Beispiel: