sql >> Database >  >> RDS >> PostgreSQL

De tabel doorgeven als parameter

Zoals @dezso al zei, heb je in dit geval dynamische SQL nodig.

Dynamische SQL met EXECUTE

Dus je bent op de goede weg; het vormen van een dynamisch SQL-statement met PL/pgSQL, maar u hoeft alleen nog de laatste hand te leggen:

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;

Ik denk dat dit je problemen zou moeten oplossen.

Opmerking:we hebben een fout ontdekt met de bovenstaande oplossing en het gebruik van SETOF , Ik heb geprobeerd de onderstaande problemen op te lossen.

BEWERKEN:

Een paar bewerkingen hier, hopelijk zal één oplossing uw probleem oplossen. Excuseer ook eventuele syntaxisfouten in mijn vorige en huidige oplossingen; Ik heb nu geen tijd om ze te testen. :(

1) Je zou kunnen proberen een SETOF terug te sturen gehele getallen, wetende dat je natuurlijk alleen die ene teruggeeft. Uw retourtype is in dit geval een enkele rij met één kolom die een geheel getal bevat.

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;

en bel dan als:

SELECT * FROM convert_from_lon_lat(...);

2) Om specifiek een geheel getal te retourneren, denk ik dat je dit kunt proberen:

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. ERROR 1030 (HY000) op regel 25:kreeg fout 168 van opslagengine

  2. Functionele eenheden

  3. Hoe kom je aan het einde van een dag?

  4. Waarschuwingen en operators gebruiken in SQL Server