SOM @dezso nævnte, har du brug for dynamisk SQL i dette tilfælde.
Dynamisk SQL med EXECUTE
Så du er på rette vej; danner en dynamisk SQL-sætning ved hjælp af PL/pgSQL, men du skal bare have prikken over i'et:
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;
Jeg tror, at dette burde løse dine problemer.
Bemærk:Vi har opdaget en fejl med ovenstående løsning og brug af SETOF
, jeg har forsøgt at rette nedenstående problemer.
EDIT:
Et par redigeringer her, forhåbentlig vil en løsning løse dit problem. Undskyld også eventuelle syntaksfejl i mine tidligere &nuværende løsninger; Jeg har ikke tid til at teste dem lige nu. :(
1) Du kan bare prøve at returnere en SETOF
heltal, vel vidende at du selvfølgelig kun returnerer det ene. Din returtype i dette tilfælde vil så være en enkelt række med én kolonne indeholdende et 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;
og ring derefter som:
SELECT * FROM convert_from_lon_lat(...);
2) For specifikt at returnere et heltal, tror jeg, du kan prøve dette:
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;