Comme @dezso l'a mentionné, vous aurez besoin de SQL dynamique dans ce cas.
SQL dynamique avec EXECUTE
Donc, vous êtes sur la bonne voie ; former une instruction SQL dynamique en utilisant PL/pgSQL, mais vous avez juste besoin de la touche finale :
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;
Je pense que cela devrait résoudre vos problèmes.
Remarque :Nous avons découvert une erreur avec la solution ci-dessus et en utilisant SETOF
, j'ai tenté de corriger les problèmes ci-dessous.
MODIFIER :
Quelques modifications ici, j'espère qu'une solution résoudra votre problème. Veuillez également excuser toute erreur de syntaxe dans mes solutions précédentes et actuelles ; Je n'ai pas le temps de les tester pour le moment. :(
1) Vous pouvez simplement essayer de renvoyer un SETOF
entiers, sachant que bien sûr vous ne retournerez que celui-là. Dans ce cas, votre type de retour sera alors une seule ligne à une colonne contenant un entier.
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;
puis appeler en tant que :
SELECT * FROM convert_from_lon_lat(...);
2) Pour renvoyer spécifiquement un entier, je pense que vous pouvez essayer ceci :
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;