2016-03-20 3 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». Спасибо за альтернативный подход. –

Смежные вопросы