Announcement

Collapse
No announcement yet.

trigger

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • trigger

    Hallo,

    schreibe zum ersten mal einen trigger. Leider funct er nicht, wie ich will:

    er betrifft 2 Tabellen:

    Tabelle "UNTERSUCHUNG" mit den Spalten PROBE_BEFALLEN und PROBEFL_ID (FK).
    Tabelle "PROBEFLAECHE" mit PROBENANZAHL_MIT_ERGEBNIS und PROBEFL_ID (PK).

    Es gibt zu jeder PROBEFL_ID mehrere PROBE_BEFALLEN-Einträge in "UNTERSUCHUNG".
    Beim update oder delete eines Feldes "PROBE_BEFALLEN" in der Tabelle "UNTERSUCHUNG"
    soll die Anzahl der befallen Proben zu der betroffenen Probefl_id in PROBENANZAHL_MIT_ERGEBNIS der Tabelle "PROBEFLAECHE" eingetragen werden.
    Wenn also eine Probe befallen ist, soll in der Probefläche mitgezählt werden.

    Hier mein Trigger:

    CREATE OR REPLACE TRIGGER "PROBEN_TRIGGER" AFTER
    DELETE
    OR UPDATE OF "PROBE_BEFALLEN" ON "UNTERSUCHUNG" DECLARE
    ANZAHL_PROBEN_UNTERSUCHT number;

    BEGIN
    SELECT COUNT(PROBE_BEFALLEN)
    INTO ANZAHL_PROBEN_UNTERSUCHT
    FROM UNTERSUCHUNG
    WHERE PROBEFL_ID = :new.PROBEFL_ID;

    UPDATE PROBEFLAECHE
    SET PROBENANZAHL_MIT_ERGEBNIS = ANZAHL_PROBEN_UNTERSUCHT
    WHERE PROBEFL_ID = :new.PROBEFL_ID;
    END;

    Die WHERE-Bedingungen funktionieren so nicht.
    ("Fehlernder IN- oder OUT-Parameter auf Index::1").

    Ich weiß nicht, wie ich an die Probefl_id kommen soll. Geht das überhaupt ?

    Danke schon mal für die Aufmerksamkeit ! Vielleicht hat einer eine Idee ?

    Vielen Dank und Grüße
    Andi

  • #2
    Hi,

    new und old existieren nur in einem Row Level Trigger. Den kannst Du wiederum nicht verwenden, da Du auf die Tabelle zugreifst zu der der Tigger gehört Stichwort Mutating Table). Zu dem Thema hab ich auch einen kleinen Artikel geschrieben:
    http://sql-tips.de/index.php/ORA-040...le_is_mutating

    Die sauberste Methode wäre es, Änderungen und Löschungen nur über eine entsprechende Zugriffsschicht zuzulassen (z.B. Java oder PL/SQL) und dort dann auch die zusätzlichen Werte zu pflegen.

    Grundsatz: Keine fachliche Logik in Triggern

    Dim

    PS: Bei einem DELETE gibt es nie ein :new
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment

    Working...
    X