PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Passando a tabela como parâmetro


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;