Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

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



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


  • Follow-Ups:
    • Re: Te
      • From: Andreas Kretschmer

Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group