Zoals @dezso al zei, heb je in dit geval dynamische SQL nodig.
Dynamische SQL met EXECUTE
Dus je bent op de goede weg; het vormen van een dynamisch SQL-statement met PL/pgSQL, maar u hoeft alleen nog de laatste hand te leggen:
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;
Ik denk dat dit je problemen zou moeten oplossen.
Opmerking:we hebben een fout ontdekt met de bovenstaande oplossing en het gebruik van SETOF
, Ik heb geprobeerd de onderstaande problemen op te lossen.
BEWERKEN:
Een paar bewerkingen hier, hopelijk zal één oplossing uw probleem oplossen. Excuseer ook eventuele syntaxisfouten in mijn vorige en huidige oplossingen; Ik heb nu geen tijd om ze te testen. :(
1) Je zou kunnen proberen een SETOF
terug te sturen gehele getallen, wetende dat je natuurlijk alleen die ene teruggeeft. Uw retourtype is in dit geval een enkele rij met één kolom die een geheel getal bevat.
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;
en bel dan als:
SELECT * FROM convert_from_lon_lat(...);
2) Om specifiek een geheel getal te retourneren, denk ik dat je dit kunt proberen:
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;