sql >> Database teknologi >  >> RDS >> PostgreSQL

Sender tabellen som parameter

SOM @dezso nævnte, har du brug for dynamisk SQL i dette tilfælde.

Dynamisk SQL med EXECUTE

Så du er på rette vej; danner en dynamisk SQL-sætning ved hjælp af PL/pgSQL, men du skal bare have prikken over i'et:

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;

Jeg tror, ​​at dette burde løse dine problemer.

Bemærk:Vi har opdaget en fejl med ovenstående løsning og brug af SETOF , jeg har forsøgt at rette nedenstående problemer.

EDIT:

Et par redigeringer her, forhåbentlig vil en løsning løse dit problem. Undskyld også eventuelle syntaksfejl i mine tidligere &nuværende løsninger; Jeg har ikke tid til at teste dem lige nu. :(

1) Du kan bare prøve at returnere en SETOF heltal, vel vidende at du selvfølgelig kun returnerer det ene. Din returtype i dette tilfælde vil så være en enkelt række med én kolonne indeholdende et 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;

og ring derefter som:

SELECT * FROM convert_from_lon_lat(...);

2) For specifikt at returnere et heltal, tror jeg, du kan prøve dette:

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 ELLER MATCH hænger (meget langsomt) på flere borde

  2. Konverter sekunder til menneskelig læsbar varighed

  3. Kald lagret procedure fra sqlplus

  4. hvordan bruger man mysql med asp.net?