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

Passare la tabella come parametro

Come menzionato da @dezso, in questo caso avrai bisogno di SQL dinamico.

SQL dinamico con EXECUTE

Quindi, sei sulla strada giusta; formare un'istruzione SQL dinamica usando PL/pgSQL, ma hai solo bisogno degli ultimi ritocchi:

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;

Credo che questo dovrebbe risolvere i tuoi problemi.

Nota:abbiamo rilevato un errore con la soluzione sopra e utilizzando SETOF , ho tentato di correggere i problemi riportati di seguito.

MODIFICA:

Alcune modifiche qui, si spera che una soluzione risolva il tuo problema. Inoltre, scusate eventuali errori di sintassi nelle mie soluzioni precedenti e attuali; Non ho tempo per testarli in questo momento. :(

1) Potresti semplicemente provare a restituire un SETOF numeri interi, sapendo che ovviamente restituirai solo uno. Il tuo tipo di ritorno in questo caso sarà quindi una singola riga di una colonna contenente un numero intero.

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;

e poi chiama come:

SELECT * FROM convert_from_lon_lat(...);

2) Per restituire specificamente un numero intero, penso che tu possa provare questo:

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;