From: | "Thomas Zuberbuehler" <tzuberbuehler(at)datacomm(dot)ch> |
---|---|
To: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Temporäre Tabelle in Stored Procedure (FAQ 4.19 ähnlicher Fehler!) |
Date: | 2006-11-18 14:05:28 |
Message-ID: | e545098a0611180605i5df92f35nb23a8bea5df71055@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-de-allgemein |
Hallo
Ich brauche dringend Eure Hilfe! Ich habe eine Funktion, die von einem
Trigger aufgerufen wird, immer dann wenn eine Zeile in die Tabelle
'hikeroute' eingefügt wurde.
Die Funktion tut nichts anderes, als den prozentualen Anteil von
asphaltierten Wege und Naturpfade zu berechnen und in einer separaten
Tabelle abspeichern.
Dazu muss ich eine rechenintensive, räumliche Abfrage, welche als
Resultat alle Segmente (mit der Information asphaltiert oder nicht)
einer Route. Da ich jedoch diese Operation wegen der Performance nur
einmal ausführen möchte, speichere ich das Resultat in einer
temporären Tabelle. Füge ich nun der Tabelle hikeroute mehrere neue
Einträge hinzu, so wird der erste Eintrag hinzugefügt und die
nachfolgenden lösen folgenden Fehler aus:
<code>
psql:hikeroutes.sql:37: ERROR: relation with OID 41384 does not exist
KONTEXT: SQL statement "SELECT count(*) FROM htable"
PL/pgSQL function "getsurfacing" line 24 at select into variables
</code>
Ich habe bereits intensiv im Internet recherchiert, doch finde ich
keine Lösung die funktioniert..! Anscheinend handelt es sich um das
Problem, wie in der offiziellen FAQ 4.19 beschrieben. Kann mir jemand
helfen? Hat jemand eine Idee, wie ich meine Funktion zum Laufen
bringen kann? Ich bin auf Eure Hilfe angewiesen. Ich weiss nicht mehr
wie weiter...
Vielen lieben Dank bereits im Voraus!
Gruss aus Zürich
Thomas
<code>
CREATE OR REPLACE FUNCTION getSurfacing() RETURNS TRIGGER AS '
DECLARE
rows FLOAT;
rec RECORD;
nature FLOAT;
asphalt FLOAT;
undefined FLOAT;
BEGIN
IF (select count(*) from pg_tables where tablename=''htable'') THEN
EXECUTE ''DROP TABLE '' || ''htable'';
END IF;
CREATE LOCAL TEMPORARY TABLE htable AS (
SELECT s.name FROM hikeroute h, surfepm s
WHERE s.the_geom && setSRID(box2d(h.the_geom)::box2d, 21781)
AND h.id = NEW.id
AND within(s.the_geom, h.the_geom)
);
/* funktioniert auch nicht
EXECUTE ''
CREATE LOCAL TEMPORARY TABLE htable AS (
SELECT s.name FROM hikeroute h, surfepm s
WHERE s.the_geom && setSRID(box2d(h.the_geom)::box2d, 21781)
AND h.id = '' || NEW.id || ''
AND within(s.the_geom, h.the_geom)
)
'';
*/
SELECT INTO rows count(*) FROM htable;
SELECT INTO asphalt count(*) FROM htable WHERE name ~* ''Hartbelag'';
asphalt := (100/rows)*(asphalt);
SELECT INTO nature count(*) FROM htable WHERE name ~* ''Naturbelag'';
nature := (100/rows)*(nature);
undefined := 100 - nature - asphalt;
INSERT INTO roadsurfacing VALUES(NEW.gid, nature, asphalt, undefined);
RETURN NEW;
EXCEPTION
WHEN division_by_zero THEN
RAISE NOTICE ''caught division_by_zero !!'';
RETURN OLD;
END;
' LANGUAGE plpgsql;
</code>
--
Thomas Zuberbuehler
http://www.zubi.li
From | Date | Subject | |
---|---|---|---|
Next Message | Andreas Kretschmer | 2006-11-18 14:17:04 | Re: Te |
Previous Message | Susanne Ebrecht | 2006-11-17 14:13:50 | Bericht LWE Köln |