Temporäre Tabelle in Stored Procedure (FAQ 4.19 ähnlicher Fehler!)

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

Responses

  • Re: Te at 2006-11-18 14:17:04 from Andreas Kretschmer

Browse pgsql-de-allgemein by date

  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