2016-03-20 15 views
1

私はPL \ pgSQLの手続き型言語の2つの幾何学的データ型、例えば多点と複数行の文字列の関数を作成しようとしています。すべての点で30メートル以内の線をすべて選択したい。私が試したことは次のとおりです。PL pgSQL関数でジオメトリを使用していますか?

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; 

この関数は、ジオメトリデータ型のためにエラーを返します。 plpgsql関数でジオメトリ・データを使用/処理するためのアドバイスはありますか?

答えて

4

あなたの関数には、かなり小さな構文ミスがあります。ワーキング機能については、以下のバージョンを参照してください。

最も重要な
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; 

:パラメータのためtable.field表記を使用しないでください。代わりに、単純な名前を使用して、関数を呼び出すときに適切なフィールドを使用します。ちなみに

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

を、あなたは、すべての機能を使用せずに同じ機能を得ることができます。

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

おかげで多くのことを。私はあなたの提案に従って構文を修正し、うまくいった!はい、私はダイレクトクエリの代わりの方法を知っています。それにもかかわらず、私は "plpgsql"の方法でそれを行うことにもっと興味を持っていました。代わりのアプローチにも感謝します。 –

関連する問題