2016-03-20 9 views
1

Ich versuche, eine Funktion in PL \ pgSQL prozedurale Sprache von zwei geometrischen Datentypen, Multipoint und Multiline-String zum Beispiel zu erstellen. Ich möchte alle Linien innerhalb von 30 Metern Entfernung für alle Punkte auswählen. Hier ist, was ich versucht habe:Verwenden von Geometrie in PL pgSQL-Funktionen?

Create OR Replace Function get_streets(bar.geom geometry foo.geom geometry) 
Returns geometry AS $$ 
BEGIN 
    IF ST_DWithin(bar.geom, foo.geom, 30.0) Then 
    Return foo.geom; 
    ELSE 
    Return null; 
    END IF 
    Return foo.geom; 
END; 
$$ Language plpgsql; 

Die Funktion gibt einen Fehler wegen der Geometrie Datentyp zurück. Irgendwelche Tipps zur Verwendung/Handhabung von Geometriedaten in plpgsql-Funktionen?

Antwort

4

Sie haben einige kleine Syntaxfehler in Ihrer Funktion. Siehe die Version unten für eine Arbeitsfunktion:

CREATE FUNCTION get_streets(g1 geometry, g2 geometry) RETURNS geometry AS $$ 
BEGIN 
    IF ST_DWithin(g1, g2, 30.0) THEN 
    RETURN g2; 
    END IF; 
    RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; 

Am wichtigsten ist: Sie table.field Notation nicht für die Parameter verwenden. Stattdessen einen einfachen Namen verwenden und das entsprechende Feld verwenden, wenn Sie die Funktion aufrufen:

SELECT get_streets(bar.geom, foo.geom) 
FROM bar 
JOIN foo on ... 

Im Übrigen können Sie die gleiche Funktionalität erhalten, ohne eine Funktion überhaupt mit:

SELECT foo.geom 
FROM foo 
JOIN bar ON ST_DWithin(bar.geom, foo.geom, 30) 
WHERE <other conditions>; 
+0

Vielen Dank. Ich korrigierte die Syntax nach Ihrem Vorschlag und es hat funktioniert! Ja, mir ist ein alternativer Ansatz für die direkte Abfrage bekannt. Trotzdem war ich mehr daran interessiert, es nach "plpgsql" zu machen. Danke auch für den alternativen Ansatz. –