2016-03-20 24 views
1

我正在嘗試在兩種幾何數據類型,例如多點和多行字符串的PL \ pgSQL過程語言中創建一個函數。我想選擇所有點在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」的方式來做。感謝您的替代方法。 –