Hilfeeee!Trigger Problem

zyth

Grünschnabel
Hallo zusammen,

ich habe einem Trigger erstellt, der auch Valid ist aber er funktioniert leider nicht.
Wer kann mir hier weiterhelfen?, für Jeder Hilfe bin ich sehr Dankbar.

In eine Oracle Tabelle ANGEBOTE gibt es unter anderem eine Spalte ERGEBNIS, die bestimmte Einträge, wie z.B. NK, NT, NR, NB und ER enthält, und eine Spalte DAENDDAT mit dem Format DATE.
Ich will das das Aktuelle Datum (SYSDATE) in die Spalte DAENDDAT automatisch eingetragen wird, sobald ich in der Spalte ERGEBNIS den vorhandenen Wert auf ER ändere.
Meine Trigger sicht so aus:

CREATE OR REPLACE TRIGGER ANG_DAT_AKT
AFTER INSERT OR UPDATE
OF ERGEBNIS
ON ANGEBOTE
FOR EACH ROW
DECLARE
Tagesdatum Date;
BEGIN
select sysdate into Tagesdatum from dual;
IF ((:OLD.ERGEBNIS != ’ER’) AND (:NEW.ERGEBNIS =’ER’)) THEN
Update Angebote SET DAENDDAT = Tagesdatum;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
null;
WHEN OTHERS THEN
null;
END;
/
 
Zunächst mal solltes du deine Codebeispiel in eine lesbare Form bringen.

SQL:
CREATE OR REPLACE TRIGGER ANG_DAT_AKT
   AFTER INSERT OR UPDATE
   OF ERGEBNIS
   ON ANGEBOTE
   FOR EACH ROW
DECLARE
   Tagesdatum Date;
BEGIN
   select sysdate into Tagesdatum from dual;
   IF ((:OLD.ERGEBNIS != ’ER’) AND (:NEW.ERGEBNIS =’ER’)) THEN
      Update Angebote SET DAENDDAT = Tagesdatum;
   END IF;
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      null;
   WHEN OTHERS THEN
      null;
END;
/

In deinem UPDATE Statement ist gar keine WHERE Klausel. Sollen alle Sätze das aktuelle Datum erhalten? Wenn ja wirst du auf den Fehler "ORA-xxxxx Trigger cannot modify mutating Table" oder so ähnlich laufen, nimm einfach mal deinen EXCEPTION Block raus, dann bekommst du auch die Fehlermeldung.

Wenn du nur das Datum des einen Satzes ändern möchtest, solltest du am besten einen BEFORE Trigger nehmen:

SQL:
CREATE OR REPLACE TRIGGER ANG_DAT_AKT
   BEFORE INSERT OR UPDATE
   OF ERGEBNIS
   ON ANGEBOTE
   FOR EACH ROW
DECLARE
BEGIN
   IF ( ((:OLD.ERGEBNIS != ’ER’) OR (:OLD.ERGEBNIS IS NULL)) AND (:NEW.ERGEBNIS =’ER’)) THEN
      :NEW.DAENDDAT := SYSDATE;
   END IF;
END;
/
 
Zuletzt bearbeitet von einem Moderator:
Zurück