Como o @dezso mencionou, você precisará de SQL dinâmico neste caso.
SQL Dinâmico com EXECUTE
Então, você está no caminho certo; formando uma instrução SQL dinâmica usando PL/pgSQL, mas você só precisa dos toques finais:
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;
Acredito que isso deve resolver seus problemas.
Observação:descobrimos um erro com a solução acima e usando
SETOF
, tentei corrigir os problemas abaixo. EDITAR:
Algumas edições aqui, espero que uma solução resolva seu problema. Além disso, desculpe quaisquer erros de sintaxe nas minhas soluções anteriores e atuais; Não tenho tempo para testá-los agora. :(
1) Você pode tentar retornar um
SETOF
inteiros, sabendo que é claro que você retornará apenas um. Seu tipo de retorno neste caso será uma única linha de uma coluna contendo um inteiro. 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;
e depois chame como:
SELECT * FROM convert_from_lon_lat(...);
2) Para retornar especificamente um número inteiro, acho que você pode tentar isso:
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;