Peter: Prozeduraufruf in Trigger

Hi, hab ne Fragen zu Triggern und Prozeduren.

Wie kann ich in einem Trigger eine Prozedur aufrufen?

begin
 execute prozedurname(globale_variable);
end;

erzeugt eine Fehlermeldung:

Error(5,17): PLS-00103: Fand das Symbol "prozdurname" als eines der folgenden erwartet wurde:     := . ( @ % ; immediate Das Symbol ":=" ersetzte "prozedurname", um fortzufahren.

Was hab ich falsch gemacht?

  1. Hi, hab ne Fragen zu Triggern und Prozeduren.

    Wie kann ich in einem Trigger eine Prozedur aufrufen?

    begin
    execute prozedurname(globale_variable);
    end;

    erzeugt eine Fehlermeldung:

    Error(5,17): PLS-00103: Fand das Symbol "prozdurname" als eines der folgenden erwartet wurde:     := . ( @ % ; immediate Das Symbol ":=" ersetzte "prozedurname", um fortzufahren.

    Was hab ich falsch gemacht?

    Welche Datenbank verwendest du denn???

    Normaler aufbau eines triggers...so wie ich es kenne:

    CREATE OR REPLACE TRIGGER Schema.triggername
    AFTER DELETE OR INSERT OR UPDATE ON
    tabellenname
    REFERENCING OLD AS OLD NEW AS NEW
    FOR EACH ROW
    DECLARE
    ID number;
    BEGIN
    prozedurname();
    END;

    1. Hi, hab ne Fragen zu Triggern und Prozeduren.

      Wie kann ich in einem Trigger eine Prozedur aufrufen?

      begin
      execute prozedurname(globale_variable);
      end;

      erzeugt eine Fehlermeldung:

      Error(5,17): PLS-00103: Fand das Symbol "prozdurname" als eines der folgenden erwartet wurde:     := . ( @ % ; immediate Das Symbol ":=" ersetzte "prozedurname", um fortzufahren.

      Was hab ich falsch gemacht?

      Welche Datenbank verwendest du denn???

      Normaler aufbau eines triggers...so wie ich es kenne:

      CREATE OR REPLACE TRIGGER Schema.triggername
      AFTER DELETE OR INSERT OR UPDATE ON
      tabellenname
      REFERENCING OLD AS OLD NEW AS NEW
      FOR EACH ROW
      DECLARE
      ID number;
      BEGIN
      prozedurname();
      END;

      Hi,

      sorry, hab ich vergessen zu schreiben. Setze Oracle ein.
      Dein Vorschlag funktioniert auch nicht, hatte ich schon getestet, Fehlermeldung ist dann folgende:

      Error(5,8): PL/SQL: Statement ignored
      Error(5,39): PLS-00302: Komponente 'globale_variable' muss deklariert werden

      1. Ich gehe einfach mal davon aus das du das in sql plus eingibst.
        Sry dann muss ich sagen das ich auch nciht weiterhelfen kann...

        Diese Syntax geht nämlich bei mir. Ich benutze ebenfalls Oracle.
        Gecodet wird unter toad...

        ID number; sollte man vielleicht weglassen...sollte ja nur ein Beispiel sein. Nicht das er irgendwelche reservierten Namen hat.

        Was er da mit globalen Variablen hat wundert mich ein wenig...benennst du vielleicht zufällig einen trigger genauso wie etwas anderes???

        Ansonsten viel Glück...falls es eine Lösung gibt...sag mal Bescheid.

        Marian

      2. Hallo,

        Error(5,39): PLS-00302: Komponente 'globale_variable' muss deklariert werden

        Dann ist die Variable im aktuellen Kontext nicht sichtbar. Vielleicht ist sie in einem Package deklariert, was Dich dazu veranlassen sollte, die variable mit dem Package-Namen anzusprechen.

        Abgesehen davon halte ich es für nicht gerade sinnvoll, globale Variablen in Verbindung mit Trigger einzusetzen.
        Aber das ist eine andere Geschichte.

        Grüße
          Klaus

        1. Hallo,

          Error(5,39): PLS-00302: Komponente 'globale_variable' muss deklariert werden

          Dann ist die Variable im aktuellen Kontext nicht sichtbar. Vielleicht ist sie in einem Package deklariert, was Dich dazu veranlassen sollte, die variable mit dem Package-Namen anzusprechen.

          Abgesehen davon halte ich es für nicht gerade sinnvoll, globale Variablen in Verbindung mit Trigger einzusetzen.
          Aber das ist eine andere Geschichte.

          Grüße
            Klaus

          Hi,

          das mit der Variablen hab ich mir auch gedacht, sie ist in einem Package deklariert, hab es auch versucht, den Package-Namen davor zu schreiben, bekomme dann aber auch eine Fehlermeldung. Schreibe ich die Prozedur ins gleiche Package, funktioniert es auch nicht.

          Verwende eine globale Variable, da ich einem Mutating Table Problem ausweichen musste. Ein For Each Row Trigger schreibt die aktuelle id in die Variable, der zweite hier angesprochene soll sie dann nehmen und sie weitergeben.
          Wieso hälst du die Verwendung von globalen Variablen in Triggern nicht für sinnvoll? Würde mich interessieren.
          Gruss

          1. Verwende eine globale Variable, da ich einem Mutating Table Problem ausweichen musste.

            LOL !!

            Wieso hälst du die Verwendung von globalen Variablen in Triggern nicht für sinnvoll? Würde mich interessieren.

            Schon mal was von Geltungsbereichen ("scope") und Logik-Verteilung gehört?

            1. super Beitrag.

            2. Verwende eine globale Variable, da ich einem Mutating Table Problem ausweichen musste.

              LOL !!

              Was ist denn ein mutating table problem (dem es mit einer globalen Variable auszuweichen gilt ;)?

              Wieso hälst du die Verwendung von globalen Variablen in Triggern nicht für sinnvoll? Würde mich interessieren.

              Schon mal was von Geltungsbereichen ("scope") und Logik-Verteilung gehört?

              Trigger lösen sich irgendwann aus, oft auch, wenn es der Programmierer nicht wünscht bzw. gar in Betracht gezogen hat. (Ja, auch der "sehr sehr gute Programmierer" hat das Problem.)

              Trigger sind sparsamst zu verwenden und sind für alerts recht gut geeignet, Bsp.:
              Peter geht auf die Personaltabelle und ändert den Betrag seiner monatilichen Bezüge. Daraufhin fired ein Trigger und generiert ein paar E-Mails (unter anderem ein bestimmtes Schreiben, auch "Auto-Künd" genannt).

              Der andere Punkt ist natürlich die Logikverteilung und der scope. Logik packt man einfach nicht in Trigger, die irgendwann firen oder auch nicht. Ausser "Alarmlogik" kennen wir kein vernünftiges Beispiel für den Einsatz von Triggern und wir kennen einge Beispiele.

          2. Hallo,

            das mit der Variablen hab ich mir auch gedacht, sie ist in einem Package deklariert, hab es auch versucht, den Package-Namen davor zu schreiben, bekomme dann aber auch eine Fehlermeldung. Schreibe ich die Prozedur ins gleiche Package, funktioniert es auch nicht.

            'Funktioniert nicht' ist keine Fehlerbeschreibung.
            Welche Fehlermeldungen genau bekommst Du bei der Verwendung von welchem Code?

            Wieso hälst du die Verwendung von globalen Variablen in Triggern nicht für sinnvoll? Würde mich interessieren.

            Ich halte Trigger an sich für problematisch, das dadurch die Programmierlogik verteilt implementiert ist und nicht an einer einzigen Stelle.
            Datenbanksysteme wie Oracle haben für mich den Vorteil mittels Stored procedures bzw. Packages relativ einfach auch komplexere Logik direkt in der Datenbank zu implementieren. Und der programmiertechnische Aufwand in einer Datenbank-Client-Anwendung DML-Statements (die dann irgendwelche Trigger auslösen) oder alternativ einen Prozedur-Aufruf zu implementieren ist imho annähernd der gleiche.
            Allerdings habe ich bei Prozeduren den Vorteil zusätzliche Datenmanipulationen oder -prüfungen einzubauen (und das eventuell auch nachträglich), die keinerlei Änderungsaufwand in der Client[1]-Anwendung erforderlich machen.

            Ausserdem können, wie in Deinem Falle, auch ungewollte Seiteneffekte auftreten, wie z.B. dass der von Dir hier angesprochene zweite Trigger, der die globale Variable braucht, auch ausgelöst wird, ohne dass eine andere Datenbank-seitige Logik die Variable vorher korrekt befüllt (z.B. der von Dir angesprochene erste Trigger). Es wird also relativ schnell komplex und der Code der notwendig wird um allfälliges Fehlverhalten zu verhindern macht das ganze letztendlich auch nicht gerade übersichtlicher.

            Grüße
              Klaus

            [1] Unter Client meine ich hier die Anwendung, welche auf die Datenbank zugreift (also den Cleint aus der Datenbanksicht), welche selbst durchaus auch ein Serverprozess sein kann.

            1. Ich halte Trigger an sich für problematisch, das dadurch die Programmierlogik verteilt implementiert ist und nicht an einer einzigen Stelle.

              Auf den Punkt gebracht ist es ein Verwaltungsproblem, jede DML-Operation auf eine Tabelle kann Trigger auslösen, wenn welche implementiert sind, d.h. wiederum bei jeder SP, die bestimmte DML-Operationen auf bestimmten Tabellen durchführt, ist die gesamte involvierte Triggerlogik zu prüfen. An vernünftige Codeverteilung und Kapselung ist da nicht mehr zu denken, dafür wird Geheimwissen wichtig, MAs unersetzlich.

              Provokativ formuliert ist ein Trigger ein wildes GOTO.