Announcement

Collapse
No announcement yet.

Trigger mir Update Statement

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

  • Trigger mir Update Statement

    Hi

    ich habe eine problem mit einem Trigger
    er betrifft 2 tabellen und zwar die erste heisst ausleihe in ihr werden u.a. mahngebuehren für ausleihen erfasst

    die 2. tabelle ist einzig für ein frontend (apex) dort werden die gebuehren pro quartal für die verschiedenen standorte aufgelistet

    also ungefähr so

    Code:
    STANDORT                                           QUARTAL GEBUEHR                
    -------------------------------------------------- ------- ---------------------- 
     Allee der Kosmonauten                             2008-1                         
     Allee der Kosmonauten                             2008-2  10,3                   
     Allee der Kosmonauten                             2008-3  38,5                   
     Allee der Kosmonauten                             2008-4  7,3                    
     Allee der Kosmonauten                             2009-1  14,8                   
     Allee der Kosmonauten                             2009-2                         
     Allee der Kosmonauten                             2009-3                         
     Blankenburg                                       2008-1  19,2                   
     Blankenburg                                       2008-2  7,8                    
     Blankenburg                                       2008-3  23,7                   
     Blankenburg                                       2008-4  24,5                   
     Blankenburg                                       2009-1  32,6                   
     Blankenburg                                       2009-2                         
     Blankenburg                                       2009-3       
    
    
    usw.
    der trigger soll nun wenn in der tabelle ausleihe neue gebuehren entstehen automatisch die schnittstellentabelle aktualisieren

    hier mal der trigger soweit wie ich gekommen bin

    Code:
    CREATE OR REPLACE TRIGGER STANDORTGEBUEHREN
    AFTER UPDATE OF GEBUEHR ON AUSLEIHE
    FOR EACH ROW
      lv_gebuehr ausleihe.gebuehr%type
    BEGIN
      SELECT au.gebuehr INTO lv_gebuehr
      FROM ausleihe au
      WHERE :new.gebuehr = gebuehr
      UPDATE apex_standortgebuehren SET gebuehren = lv_gebuehr 
    END;
    Fehlermeldung von oracle

    Fehler: ORA-04079: Ungültige Trigger-Angabe

    leider komme ich damit nicht weiter

    jemand eine idee

    Gruß

  • #2
    Ich glaube, da sind noch Sytaxfehler drin:
    Code:
    ...
    FOR EACH ROW
    DECLARE
      lv_gebuehr ausleihe.gebuehr%type;
    BEGIN
    ...
     SELECT ... ;
     UPDTAE  ... ;

    Comment


    • #3
      Hi,

      Du hast zwei grundsätzliche Fehler in deinem Trigger (von etwaigen syntaktischen mal abgesehen):
      1. Du packst fachliche Logik in einen Trigger. Das sollte man nicht machen, da man hiermit schwer wartbare Anwendungen produziert.
      2. Du selectierst in einem ROW LEVEL Trigger auf die Tabelle zu der der Trigger gehört, was wiederum Oracle nicht erlaubt (Stichwort Mutating Table).

      Packe deine Programmlogik am besten in eine PL/SQL Procedur, die von einem Process aus aufgerufen wird, wenn die Seite mit den neuen Daten submittet wird.

      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


      • #4
        da hab ich echt nur dumme semikolons vergessen danke
        jetzt läuft der trigger ohne kompilierfehler

        @dimitri danke für die tipps leider stehe ich etwas unter zeitdruck was die aufgabe angeht und da der trigger läuft hoffe ich das der auftraggeber darüber hinwegschaut

        Comment


        • #5
          und da der trigger läuft hoffe ich das der auftraggeber darüber hinwegschaut
          Das ist genau der Punkt, denn der Trigger wird beim ersten Update folgenden Fehler produzieren:
          Code:
          ORA-04091: table ausleihe is mutating, trigger/function may not see it
          Wie schon gesagt selektierst Du in einem Row Level Trigger auf die Tabelle zu der der Trigger gehört und würdest damit gegen die Regel verstoßen, dass eine Änderung immer komplett oder garnicht durchgeführt wird. Während der Update läuft versuchst Du in die sich gerade ändernde Tabelle zu sehen und quasi einen Zwischenstand herauszuselektieren. Das erlaubt Oracle aus gutem Grund nicht.

          Im übrigen wird ein Update Trigger nicht deine Anforderung erfüllen:
          der trigger soll nun wenn in der tabelle ausleihe neue gebuehren entstehen automatisch die schnittstellentabelle aktualisieren
          Neue Gebühren werden hier nicht erfasst - nur geänderte. Da eine neue Gebühr aber nie in die apex_standortgebuehren kopiert wurde kann er dort auch nicht geändert werden.

          Ich versteh auch nicht, warum Du überhaupt einen Trigger verwendest. Wenn nicht gewünscht ist, das direkt aus Apex heraus auf die tabelle selektiert wird, dann erstell dir eben eine View, die Du dann im Report selektierst. Dann kannst Du dir das ganze Triggerzeugs sparen.

          Dim
          Zuletzt editiert von dimitri; 27.06.2009, 07:52.
          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


          • #6
            hatte ich auch zu beginn vor das mit ner view zu erledigen
            aber da ich in apex ja dann die link column auf unique column stellen muss und einen primärschlüssel angeben soll den die view leider nicht hat
            entschloss ich mich zur schnittstellentabelle und rowid beim link column

            vielleicht hast du ja ne idee was ich in apex einstellen müsste das es auch über eine view ohne "unique column" geht

            Comment


            • #7
              Nimm das Feld der View, die auch in der ursprünglichen Tabelle den PK bildet.
              Ich nehme an, Du möchtest keine Änderungen aus Apex heraus machen oder? Falls doch, dann musst Du ja eh auf die Ursprungstabelle gehen, da du ansonsten ja unterschiedliche Tabellen für die Datenhaltung verwendest.

              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

              Working...
              X