КАКТО спомена @dezso, в този случай ще ви трябва динамичен SQL.
Динамичен SQL с EXECUTE
И така, вие сте на прав път; формиране на динамичен SQL израз с помощта на PL/pgSQL, но ви трябват само последните щрихи:
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text)
RETURNS integer AS $$
BEGIN
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices
ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
END
$$ LANGUAGE plpgsql;
Вярвам, че това трябва да реши проблемите ви.
Забележка:Открихме грешка с горното решение и използването на SETOF
, опитах се да коригирам проблемите по-долу.
РЕДАКТИРАНЕ:
Няколко редакции тук, надяваме се, че едно решение ще реши проблема ви. Също така, моля, извинете всички синтактични грешки в моите предишни и настоящи решения; В момента нямам време да ги тествам. :(
1) Можете просто да опитате да върнете SETOF
цели числа, знаейки, че разбира се ще върнете само едно. Вашият върнат тип в този случай ще бъде единичен ред с една колона, съдържащ цяло число.
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text)
RETURNS SETOF integer AS $$
BEGIN
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices
ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
END
$$ LANGUAGE plpgsql;
и след това се обадете като:
SELECT * FROM convert_from_lon_lat(...);
2) За да върнете конкретно цяло число, мисля, че можете да опитате това:
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text)
RETURNS integer AS $$
DECLARE
return_id integer;
BEGIN
EXECUTE format('SELECT id FROM %I AS vertices
ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table)
INTO return_id;
RETURN return_id;
END
$$ LANGUAGE plpgsql;