Announcement

Collapse
No announcement yet.

Trigger Problem mit :OLD

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

  • Trigger Problem mit :OLD

    Hallo Leute,
    ich hab ein kleines Problem, dass die mit OLD deklarierte Spalte keine Werte bekommt.

    Mein Trigger:
    Code:
    CREATE OR REPLACE TRIGGER Dummy_TRG
    BEFORE INSERT
    ON DummySchema.Dummy_T 
    REFERENCING NEW AS New OLD AS Old
    FOR EACH ROW
    DECLARE
    tmpVar DATE;
    BEGIN
     select CalcDate(:OLD.IDATE, :NEW.REFDATE) into :NEW.IDATE from dual;
       EXCEPTION
         WHEN OTHERS THEN
           RAISE;
    END Dummy_TRG;
    /
    Die Funktion an sich funktioniert. Wenn ich anstatt :OLD.IDATE zB to_date('01.08.2009 14:15:00','dd.mm.yyyy hh24:mi:ss') schreibe liefert Sie das gewünschte Ergebnis.
    Das :OLD.IDATE gibt null in die Funktion... Dementsprechend funktioniert es nicht.

    Was mache ich denn falsch?

    Grüße

  • #2
    Was sollte denn deiner Meinung nach bei einem INSERT in der Variable stehen?
    Oder anders gefragt: Wie sieht ein Satz in der Datenbank aus bevor Du ihn einfügst?

    Dim
    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


    • #3
      OLD und NEW beziehen sich auf den Wert vor der Änderung bzw. auf den Wert nach der Änderung der betreffenden Zeile.
      Dein Trigger wird beim auslösenden Ereignis INSERT ausgelöst. Das bedeutet, dass eine neue Zeile eingefügt wird. In diesem Falle gibt es keinen "alten" Wert. OLD gibt deshalb NULL als Wert zurück.
      OLD macht nur Sinn bei UPDATE und DELETE.

      kuemmelchen

      Comment


      • #4
        Danke für eure Hilfe!
        Wie kann ich das denn machen, dass ich ein Datum übern Insert bekomme, dieses durch die Funktion manipuliere und es dann wieder in die gleiche Spalte schreibe also sozusagen ersetze.
        Oder ist es zwingend notwendig, dass ich den manipulierten Wert in eine andere Spalte schreibe?

        Comment


        • #5
          Hier ein einfaches Beispiel, das ein Datum in derselben Spalte beim Einfügen manipulier (heute ist Weihnachten ).
          Code:
          DROP TABLE test_a;
          
          CREATE TABLE test_a (ID VARCHAR2(10), datum DATE);
          
          CREATE OR REPLACE TRIGGER trigger_test_a
             BEFORE INSERT
             ON test_a
             FOR EACH ROW
          BEGIN
             :NEW.datum := :NEW.datum - 259;
          END;
          
          INSERT INTO test_a
               VALUES ('heute', SYSDATE);
          
          SELECT * FROM test_a;
          Code:
          ID         DATUM   
          ---------- --------
          heute      24.12.08
          Aber welche Anforderung steht dahinter ? Es ist normalerweise keine gute Idee, TRIGGER die Daten manipulieren zu lassen! Bessere Begründungen dazu, als ich sie formulieren könnnte, gibt es u.a. auch hier im Forum !

          Comment

          Working...
          X