sql >> Databáze >  >> RDS >> PostgreSQL

Předání tabulky jako parametru

Jak již bylo zmíněno @dezso, v tomto případě budete potřebovat dynamické SQL.

Dynamické SQL s příkazem EXECUTE

Takže jste na správné cestě; vytvoření dynamického příkazu SQL pomocí PL/pgSQL, ale potřebujete jen poslední úpravy:

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;

Věřím, že by to mělo vyřešit vaše problémy.

Poznámka:U výše uvedeného řešení a pomocí SETOF jsme objevili chybu , pokusil jsem se opravit níže uvedené problémy.

UPRAVIT:

Zde je několik úprav, doufejme, že jedno řešení váš problém vyřeší. Také prosím omluvte všechny syntaktické chyby v mých předchozích a současných řešeních; Nemám teď čas je testovat. :(

1) Můžete zkusit vrátit SETOF celá čísla, s vědomím, že samozřejmě vrátíte pouze jedničku. Váš návratový typ v tomto případě bude jeden řádek s jedním sloupcem obsahující celé číslo.

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;

a poté zavolejte jako:

SELECT * FROM convert_from_lon_lat(...);

2) Chcete-li konkrétně vrátit celé číslo, myslím, že můžete zkusit toto:

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. Výsledkem DAO.Recordset.Update je zámek záznamu

  2. Co je DTU v Azure SQL Database a jak zjistit, kolik potřebujeme

  3. Proč vkládat blok příkazů TSQL, když je úroveň izolace transakce pro jinou transakci serializovatelná pomocí nekonfliktního filtru?

  4. Smazat více řádků s PDO a zaškrtávacími políčky pomocí připravených výpisů?