SOM @dezso nämnde behöver du dynamisk SQL i det här fallet.
Dynamisk SQL med EXECUTE
Så du är på rätt spår; bildar en dynamisk SQL-sats med PL/pgSQL, men du behöver bara finputsningen:
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;
Jag tror att detta borde lösa dina problem.
Obs:Vi har upptäckt ett fel med ovanstående lösning och användning av SETOF
, jag har försökt åtgärda problemen nedan.
EDIT:
Några ändringar här, förhoppningsvis kommer en lösning att lösa problemet. Ursäkta också eventuella syntaxfel i mina tidigare &nuvarande lösningar; Jag har inte tid att testa dem just nu. :(
1) Du kan bara prova att returnera en SETOF
heltal, med vetskap om att du naturligtvis bara returnerar det ena. Din returtyp i det här fallet kommer då att vara en enda rad med en kolumn som innehåller ett heltal.
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;
och ring sedan som:
SELECT * FROM convert_from_lon_lat(...);
2) För att specifikt returnera ett heltal tror jag att du kan prova detta:
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;