Jak již bylo zmíněno @dezso, v tomto případě budete potřebovat dynamické SQL.
Dynamické SQL s příkazem EXECUTE
Takže jste na správné cestě; vytvoření dynamického příkazu SQL pomocí PL/pgSQL, ale potřebujete jen poslední úpravy:
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;
Věřím, že by to mělo vyřešit vaše problémy.
Poznámka:U výše uvedeného řešení a pomocí SETOF
jsme objevili chybu , pokusil jsem se opravit níže uvedené problémy.
UPRAVIT:
Zde je několik úprav, doufejme, že jedno řešení váš problém vyřeší. Také prosím omluvte všechny syntaktické chyby v mých předchozích a současných řešeních; Nemám teď čas je testovat. :(
1) Můžete zkusit vrátit SETOF
celá čísla, s vědomím, že samozřejmě vrátíte pouze jedničku. Váš návratový typ v tomto případě bude jeden řádek s jedním sloupcem obsahující celé číslo.
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;
a poté zavolejte jako:
SELECT * FROM convert_from_lon_lat(...);
2) Chcete-li konkrétně vrátit celé číslo, myslím, že můžete zkusit toto:
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;