sql >> Base de Datos >  >> RDS >> PostgreSQL

Pasar la tabla como parámetro

COMO mencionó @dezso, necesitará SQL dinámico en este caso.

SQL dinámico con EXECUTE

Entonces, estás en el camino correcto; formando una declaración SQL dinámica usando PL/pgSQL, pero solo necesita los toques finales:

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;

Creo que esto debería resolver sus problemas.

Nota:hemos descubierto un error con la solución anterior y al usar SETOF , he intentado corregir los siguientes problemas.

EDITAR:

Algunas ediciones aquí, con suerte una solución solucionará su problema. Además, disculpe cualquier error de sintaxis en mis soluciones anteriores y actuales; No tengo tiempo para probarlos ahora. :(

1) Podría intentar devolver un SETOF enteros, sabiendo que, por supuesto, solo devolverá uno. Su tipo de devolución en este caso será una sola fila de una columna que contenga un número entero.

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;

y luego llamar como:

SELECT * FROM convert_from_lon_lat(...);

2) Para devolver específicamente un número entero, creo que puedes probar esto:

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;