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:

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 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/interactive/sql-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?

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.

Hab den StackOverflow gefunden!

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

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.

Huch, das hatte ich auch erst schon fast schreiben wollen, aber das eine ist doch v_ und das andere t_



Andreas

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

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!