COMO mencionó @dezso, necesitará SQL dinámico en este caso.
SQL dinámico con EXECUTE
Entonces, estás en el camino correcto; formando una declaración SQL dinámica usando PL/pgSQL, pero solo necesita los toques finales:
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;
Creo que esto debería resolver sus problemas.
Nota:hemos descubierto un error con la solución anterior y al usar SETOF
, he intentado corregir los siguientes problemas.
EDITAR:
Algunas ediciones aquí, con suerte una solución solucionará su problema. Además, disculpe cualquier error de sintaxis en mis soluciones anteriores y actuales; No tengo tiempo para probarlos ahora. :(
SETOF
enteros, sabiendo que, por supuesto, solo devolverá uno. Su tipo de devolución en este caso será una sola fila de una columna que contenga un número entero.
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;
y luego llamar como:
SELECT * FROM convert_from_lon_lat(...);
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;