Мне нужно преобразовать из lat и long в geom
, чтобы использовать PostGIS. Моя проблема, у меня разные таблицы из разных мест, и я хочу передать таблицу в качестве параметра функции. Я пробовал это:Передача таблицы в качестве параметра
CREATE or REPLACE FUNCTION convert_from_lon_lat(float,float,character varying)
RETURNS integer AS $$
select id from $3 as vertices
order by vertices.geom <-> ST_SetSrid(ST_MakePoint($1,$2),4326) LIMIT 1;
$$ LANGUAGE SQL;
, но я получаю синтаксическую ошибку.
EDIT1:
Так что я изменил предыдущий код на этот:
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table character varying) RETURNS integer AS $$
BEGIN
EXECUTE('select id from _table as vertices order by vertices.geom <-> ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;');
END;
$$ LANGUAGE plpgsql;
создает без каких-либо проблем, но когда я называю это `convert_from_lon_lat (long1, long2, my_table)
Я получаю и ошибки:
ERROR: relation "_table" does not exist
Это не передаёт имя таблицы в качестве аргумента
EDIT 2:
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, tbl character varying) RETURNS integer AS $func$
BEGIN
EXECUTE format('select id from %s order by %s.the_geom <-> ST_SetSrid(ST_MakePoint('|| long || ','|| lat ||'),4326) LIMIT 1;', tbl, tbl);
END;
$func$ LANGUAGE plpgsql;
Теперь, когда я вызываю функцию, я получаю `ОШИБКА: управление Достигнут конец функции без RETURN``
RETURN QUERY EXECUTE format('...
я пытался, но я получаю ERROR: cannot use RETURN QUERY in a non-SETOF function
Вы, возможно, придется использовать PL/PgSQL и динамическую конструкцию SQL. – dezso
Я очень n00b в postgres, как бы я это сделал? – tvieira