PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Przekazywanie tabeli jako parametru

Jak wspomniał @dezso, w tym przypadku będziesz potrzebować dynamicznego SQL.

Dynamiczny SQL z EXECUTE

Więc jesteś na dobrej drodze; tworzenie dynamicznej instrukcji SQL przy użyciu PL/pgSQL, ale potrzebujesz tylko ostatnich poprawek:

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;

Uważam, że to powinno rozwiązać Twoje problemy.

Uwaga:wykryliśmy błąd w powyższym rozwiązaniu i przy użyciu SETOF , próbowałem rozwiązać poniższe problemy.

EDYTUJ:

Kilka zmian tutaj, mam nadzieję, że jedno rozwiązanie rozwiąże Twój problem. Proszę również wybaczyć wszelkie błędy składniowe w moich poprzednich i obecnych rozwiązaniach; Nie mam teraz czasu na ich testowanie. :(

1) Możesz po prostu spróbować zwrócić SETOF liczb całkowitych, wiedząc, że oczywiście zwrócisz tylko jedną. Twój typ zwracany w tym przypadku będzie wtedy pojedynczym, jednokolumnowym wierszem zawierającym liczbę całkowitą.

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 następnie zadzwoń jako:

SELECT * FROM convert_from_lon_lat(...);

2) Aby konkretnie zwrócić liczbę całkowitą, myślę, że możesz spróbować tego:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL PL/Python:wywołanie procedury składowanej w virtualenv

  2. PostgreSQL - maksymalna liczba parametrów w klauzuli IN?

  3. Sprawdź, czy tabela dziedziczy z innej tabeli w PostgreSQL

  4. Zakleszczenia Postgresa na jednoczesnych upserts

  5. Zdalne połączenie z serwerem Postgresql