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;