Benutze es doch einfach auf wie deine eigene Funktion, da steht es doch auch keine $.. drin.
Gruß Uwe
PS: die 2 inmuß du noch in den gewünschten Abstand ändern oder auch als Parameter übergeben.Code:st_dwithin( $1 , a.geom, 2)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Benutze es doch einfach auf wie deine eigene Funktion, da steht es doch auch keine $.. drin.
Gruß Uwe
PS: die 2 inmuß du noch in den gewünschten Abstand ändern oder auch als Parameter übergeben.Code:st_dwithin( $1 , a.geom, 2)
Geändert von Gisman (23.01.2012 um 16:16 Uhr)
Have a lot of fun!
Hi,
@Andres: Ich verstehe das Problem leider immer noch nicht.
@Uwe: Ich verwende keine $, diese erscheinen lediglich in der Fehlerausgabe.
Hier nocheinmal mein Problem und die Funktion so wie ich sie ausprobiert hatte:
Gegeben: Tabelle srtm(id serial, point geometry, height integer)
Problemstellung: Ich möchte zu einem Punkt den nächsten Punkt in dieser Tabelle finden. Zusätzlich darf die Distanz zu diesem Punkt einen gegebenen Threshold nicht überschreiten.
Lösung:
-Ansatz 1: Funktion (siehe 1.Post) die mir lediglich die ID des Punktes aus der srtm-tabelle zurückgibt --> funktioniert
-Ansatz 2: Funktion die mir das vollständige Tupel + die Distanz zu diesem Punkt zurückgibt --> funktioniert nicht (keine Fehler, lediglich 0 Zeilen in Ausgabe bei gleicher Query)
Hier noch einmal die Funktion die ich von Uwe übernommen hatte (leicht abgeändert auf meine Tabelle):
Wenn ich das ausführe erhalte ich folgende Fehlermeldung:Code:DROP FUNCTION my_nearest_srtm_neighbor(p_in geometry); CREATE OR REPLACE FUNCTION my_nearest_srtm_neighbor(p_in geometry) RETURNS TABLE(id integer, height numeric, point geometry, distance double precision) AS $$ DECLARE BEGIN RAISE NOTICE 'Point is: %', ST_AsText(p_in); RETURN QUERY with t1 as (select a.id, a.height, a.point, st_distance(p_in, a.point) as dist from srtm a where st_dwithin(p_in, a.point, 2)) select t1.id as id, t1.height as height, t1.geom as point, t1.dist as distance from t1 where t1.dist = (select min(dist) from t1); END; $$ LANGUAGE plpgsql;
Zur Vollständigkeit: DBMS istCode:ERROR: syntax error at or near "$2" LINE 1: ...re st_dwithin( $1 , a.point, 2)) select t1.id as $2 , t1.he... ^ QUERY: with t1 as (select a.id, a.height, a.point, st_distance( $1 , a.point) as dist from srtm a where st_dwithin( $1 , a.point, 2)) select t1.id as $2 , t1.height as $3 , t1.geom as $4 , t1.dist as $5 from t1 where t1.dist = (select min(dist) from t1) CONTEXT: SQL statement in PL/PgSQL function "my_nearest_srtm_neighbor" near line 13 ********** Fehler ********** ERROR: syntax error at or near "$2" SQL Status:42601 Kontext:SQL statement in PL/PgSQL function "my_nearest_srtm_neighbor" near line 13
PostgreSQL Version: "PostgreSQL 8.4.9 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2, 64-bit"
PostGIS Version: "POSTGIS="1.5.1" GEOS="3.2.0-CAPI-1.6.0" PROJ="Rel. 4.6.1, 21 August 2008" LIBXML="2.6.32" USE_STATS"
Ich hoffe mit diesen Infos könnt ihr mehr anfangen
Viele Grüße & nochmals Danke,
Wolfgang
Hallo Wolfgang,
Das liegt an den Namen deiner out-Parameter, die heissen wie in der Funktion angesprochene Spalten.
Bezeichne in der Funktion genauer was du meinst (srtm.point, …) oder benenne deine out-Parameter anders, dann klappts.
PG 8.4 setzt hier bei jedem Vorkommen von "point" die Variable point ($2) ein. Da steht aber nichts drin bei Aufruf, deswegen bekommst du keine Daten. Auch wird die Erstellung einer Funktion abgelehnt, wenn Variablen an Stellen hinersetzt werden sollen, wo keine hingehören.
Seit 9.0 ist das nicht mehr so. Es wird gemeckert bei Unklarheiten: ("ERROR: column reference point is ambiguous … DETAIL: It could refer to either a PL/pgSQL variable or a table column") und nicht überall stumpf ersetzt (-> "… as point").
Genauer findest du das hier:PostgreSQL: Documentation: Manuals: PL/pgSQL Under the Hood.
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen