Ergebnis 1 bis 7 von 7

Thema: INSERT mit Variablen als VALUES innerhalb eines Triggers

  1. #1
    Backbone ist offline Neuer Benutzer
    Registriert seit
    02.01.2007
    Beiträge
    3

    Standard INSERT mit Variablen als VALUES innerhalb eines Triggers

    Hallo,

    ich habe ein kleines Problem. Ich habe bisher nur für Oracle Trigger programmiert. Nun sind in Postgres leider einige Dinge anders. Hier erstmal mein Trigger:

    Code:
    CREATE OR REPLACE FUNCTION aktivstation_werte() RETURNS TRIGGER AS $akt_wert$
        DECLARE
          cur REFCURSOR;
          rec t_stamm_station%ROWTYPE;
        
          BEGIN
    	OPEN cur FOR SELECT * FROM t_stamm_station order by id; 
    	LOOP
    		FETCH cur INTO rec;
    
    		IF NOT FOUND THEN
    			EXIT;
    		END IF;
    
    		INSERT INTO v_wacs_parameter(id, name, beschreibung, parent_id, cruser) VALUES (nextval('seq_t_wacs_parameter_id'), '' || rec.id || '', '' || rec.station || '', (SELECT id FROM v_wacs_parameter WHERE name = 'aktivstation'), 'script');
            END LOOP;
    	CLOSE cur;
            RETURN NULL; -- result is ignored since this is an AFTER trigger
        END;
    $akt_wert$ LANGUAGE plpgsql;
    
    CREATE TRIGGER akt_wert AFTER INSERT ON t_wacs_parameter FOR EACH ROW EXECUTE PROCEDURE aktivstation_werte();
    Und hier die Fehler:
    Obwohl in der Tabelle t_stamm_station nur 9 Einträge sind, wird ein Stack overflow als Fehler gemeldet. Wieso?
    Stimmt das Insert in dem Trigger bzw. kann ich die Werte die in rec stehen so in der Insert Funktion nutzen?

    Vielen Dank!

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Ich kann nun auf die Schnelle nicht sehen, wo da der stack Overflow herkommt, aber warum machst du dir das so kompliziert?

    PostgreSQL kann INSERT INTO ... SELECT.

    Schau mal auf: http://www.postgresql.org/docs/8.1/i...ql-insert.html
    Bei den Beispielen findest du eines, mit dem du die Daten mittels eines Select holst und einfügst. Das dürfte die Sache doch einfacher gestalten, oder?
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Backbone Beitrag anzeigen
    Hallo,

    ich habe ein kleines Problem. Ich habe bisher nur für Oracle Trigger programmiert. Nun sind in Postgres leider einige Dinge anders. Hier erstmal mein Trigger:

    Code:
    CREATE OR REPLACE FUNCTION aktivstation_werte() RETURNS TRIGGER AS $akt_wert$
        DECLARE
          cur REFCURSOR;
          rec t_stamm_station%ROWTYPE;
        
          BEGIN
    	OPEN cur FOR SELECT * FROM t_stamm_station order by id; 
    	LOOP
    		FETCH cur INTO rec;
    
    		IF NOT FOUND THEN
    			EXIT;
    		END IF;
    
    		INSERT INTO v_wacs_parameter(id, name, beschreibung, parent_id, cruser) VALUES (nextval('seq_t_wacs_parameter_id'), '' || rec.id || '', '' || rec.station || '', (SELECT id FROM v_wacs_parameter WHERE name = 'aktivstation'), 'script');
            END LOOP;
    	CLOSE cur;
            RETURN NULL; -- result is ignored since this is an AFTER trigger
        END;
    $akt_wert$ LANGUAGE plpgsql;
    
    CREATE TRIGGER akt_wert AFTER INSERT ON t_wacs_parameter FOR EACH ROW EXECUTE PROCEDURE aktivstation_werte();
    Und hier die Fehler:
    Obwohl in der Tabelle t_stamm_station nur 9 Einträge sind, wird ein Stack overflow als Fehler gemeldet. Wieso?
    Stimmt das Insert in dem Trigger bzw. kann ich die Werte die in rec stehen so in der Insert Funktion nutzen?

    Vielen Dank!

    Ich glaube, Du solltest einfach auf rec.COLUMN zugreifen, also ... wacs_parameter_id'), rec.id , re...

    Hab aber grad nicht wirklich Zeit, weiter drüber nachzudenken.
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    Backbone ist offline Neuer Benutzer
    Registriert seit
    02.01.2007
    Beiträge
    3

    Standard

    Hab den StackOverflow gefunden!

    Innerhalb des Triggers mach ich wieder ein INSERT, dass den Trigger aufruft! Somit ruft er sich immer wieder selbst auf!

  5. #5
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Stimmt. Ich hatte die Tabellennamen deiner Triggerdefinition gar nicht beachtet, nur geschaut, ob du nicht in die gleiche insertest, aus der du liest ...

    Na dann viel Erfolg weiterhin bei deinem Projekt.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  6. #6
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Backbone Beitrag anzeigen
    Hab den StackOverflow gefunden!

    Innerhalb des Triggers mach ich wieder ein INSERT, dass den Trigger aufruft! Somit ruft er sich immer wieder selbst auf!
    Huch, das hatte ich auch erst schon fast schreiben wollen, aber das eine ist doch v_ und das andere t_
    ...


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    Backbone ist offline Neuer Benutzer
    Registriert seit
    02.01.2007
    Beiträge
    3

    Standard

    v_ ist der View zu t_!!! In dem View gibts eine Regel, die dann in t_ ein INSERT macht :-)

    Zitat Zitat von ads Beitrag anzeigen
    Ich kann nun auf die Schnelle nicht sehen, wo da der stack Overflow herkommt, aber warum machst du dir das so kompliziert?

    PostgreSQL kann INSERT INTO ... SELECT.

    Schau mal auf: http://www.postgresql.org/docs/8.1/i...ql-insert.html
    Bei den Beispielen findest du eines, mit dem du die Daten mittels eines Select holst und einfügst. Das dürfte die Sache doch einfacher gestalten, oder?
    Würde das gehen bzw. wenn in v_stamm_station 9 Einträge wären, würden dann 9 INSERTS gemacht?

    INSERT INTO v_wacs_parameter(id, name, beschreibung, parent_id, cruser) VALUES (nextval('seq_t_wacs_parameter_id'), (SELECT id FROM v_stamm_Station order by id), (SELECT name FROM v_stamm_Station order by id), 'script')

    Das Problem ist halt, das pro INSERT 2 "Variablen" da sind und die Tabellen sehr unterschiedlich sind!

Ähnliche Themen

  1. Problem Kennzeichnung der Values bei Update Rule
    Von drooper im Forum PL/pgSQL
    Antworten: 25
    Letzter Beitrag: 04.10.2009, 18:44
  2. Verschachtelung von SELECT innerhalb LIKE
    Von DFlussWebler im Forum SQL
    Antworten: 2
    Letzter Beitrag: 08.12.2008, 19:14
  3. Frage VALUES(?) parameter für PreparedStatement
    Von symbiont im Forum SQL
    Antworten: 2
    Letzter Beitrag: 12.11.2008, 09:30
  4. Überspringen eines existierenden PK Values
    Von Anus+ im Forum Trigger und Funktionen
    Antworten: 5
    Letzter Beitrag: 05.03.2007, 19:07
  5. Subselects in Triggers möglich?
    Von mandarin im Forum Trigger und Funktionen
    Antworten: 7
    Letzter Beitrag: 12.04.2006, 13:10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum