Guten Morgen Freunde,
Ich habe jetzt darüber nachgedacht. Da ich die Funktion immer nur ausführen möchte wenn sich etwas in der entsprechenden tabelle ändert (insert,update) Habe ich jetzt versucht das als Trigger Funktion (After insert or update) umzuschreiben. Dann brauche ich ja theoretisch auch den Tabellennamen nicht übergeben. Leider funktioniert das nicht wie gewünscht. Die Funktion läuft noch für das delete. Die Werte werden also gelöscht. Aber die beiden Insert Statements danach gehen nicht. Und ich finde mal wieder den Fehler nicht. In “temp” steht zum beipsiel immer nichts drin. Ich bin jetzt nicht sicher wie man in einer Trigger Funktion Variablen übergeben kann und ob es überhaupt möglich ist eine window Funktion wie lead() innerhalb des Triggers aufzurufen. Hab da jetzt schon auf den Postgres Seiten gesucht, aber bin da irgendwie nicht weiter gekommen. Geht das überhaupt oder bin ich da jetzt völlig auf dem Holzweg? Wie kann ich denn das korrekt umsetzen? ich hab mal die Tabelle und ein paar inserts angehängt, wenn vielleicht jemand Zeit und Lust hat sich das mal anzusehen? Ich bedanke mich sehr für die Hilfe und bin für jeden Tipp dankbar.
Gruss
Hanno
/-------------------------------------/
CREATE OR REPLACE FUNCTION gines_interpolate()
RETURNS trigger AS $gines_interpolate$
DECLARE
result integer;
/k numeric;/
wert numeric;
d_first numeric;
temp integer;
zaehler integer;
d1 numeric;
d2 numeric;
/tablename text;/
BEGIN
d_first := NEW.value;
execute format(‘delete from ’ || TG_TABLE_NAME || ’ where interpolated = true’) USING NEW;
zaehler := 1;
temp := lead(NEW.year) over (partition by NEW.area_id order by NEW.year)-NEW.year;
RAISE NOTICE ‘variable is %’, temp;
if temp > 1 THEN
WHILE zaehler < temp LOOP
result := NEW.year + zaehler;
d1 := NEW.value;
d2 := lead(NEW.value) over(partition by NEW.area_id order by NEW.year);
/k := ((d2-d1)/temp);/
wert := d_first + (((d2-d1)/temp) * zaehler);
execute format(‘insert into || TG_TABLE_NAME || (year,value,area_id,interpolated)
values(result,wert,NEW.area_id,true)’) USING NEW;
zaehler := zaehler+1;
END LOOP;
elsif temp <> NULL THEN
WHILE zaehler < temp LOOP
result := NEW.year + zaehler;
d1 := NEW.value;
d2 := lead(NEW.value) over(partition by NEW.area_id order by NEW.year);
/k := (d2-d1)/temp;/
wert := d_first + (((d2-d1)/temp) * zaehler);
execute format(‘insert into || TG_TABLE_NAME || (year,value,area_id,interpolated)
values(result,wert,NEW.area_id,true)’) USING NEW;
zaehler := zaehler+1;
END LOOP;
end if;
RETURN NULL;
END;
$gines_interpolate$LANGUAGE plpgsql;
/---------------------------------------------------------------------------/
CREATE TABLE public.ind_1 (
id serial NOT NULL,
area_id integer NOT NULL,
“year” integer NOT NULL,
value double precision,
interpolated boolean NOT NULL DEFAULT false,
/* Keys */
CONSTRAINT ind_1_pkey
PRIMARY KEY (id)
) WITH (
OIDS = FALSE
);
CREATE TRIGGER gines_interpolate
AFTER UPDATE OR INSERT
ON public.ind_1
FOR EACH ROW
EXECUTE PROCEDURE public.gines_interpolate();
/---------------------------------------------/
INSERT INTO ind_1 (id, area_id, year, value, interpolated) VALUES
(1, 301, 1980, 10, false),
(2, 301, 1981, 20, false),
(3, 301, 1985, 40, false),
(4, 301, 1990, 50, false),
(5, 301, 1993, 25, false),
(8, 302, 1986, 40, false),
(7, 302, 1982, 15, false),
(6, 302, 1980, 20, false),
(9, 302, 1987, 30, false),
(10, 302, 1992, 35, false),
(11, 301, 1996, 20, false);