PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Passer la table en paramètre

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;