sql >> Databasteknik >  >> RDS >> PostgreSQL

Att passera tabellen som en parameter

SOM @dezso nämnde behöver du dynamisk SQL i det här fallet.

Dynamisk SQL med EXECUTE

Så du är på rätt spår; bildar en dynamisk SQL-sats med PL/pgSQL, men du behöver bara finputsningen:

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;

Jag tror att detta borde lösa dina problem.

Obs:Vi har upptäckt ett fel med ovanstående lösning och användning av SETOF , jag har försökt åtgärda problemen nedan.

EDIT:

Några ändringar här, förhoppningsvis kommer en lösning att lösa problemet. Ursäkta också eventuella syntaxfel i mina tidigare &nuvarande lösningar; Jag har inte tid att testa dem just nu. :(

1) Du kan bara prova att returnera en SETOF heltal, med vetskap om att du naturligtvis bara returnerar det ena. Din returtyp i det här fallet kommer då att vara en enda rad med en kolumn som innehåller ett heltal.

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;

och ring sedan som:

SELECT * FROM convert_from_lon_lat(...);

2) För att specifikt returnera ett heltal tror jag att du kan prova detta:

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;



  1. MySQL bitvisa operationer, blomfilter

  2. Steg för att felsöka django.db.utils.ProgrammingError:behörighet nekad för relation django_migrations

  3. MySQL operativ hierarkisk data

  4. MySQL now() ändra tidszon