Для обработки одной строки или обработки строк одну за другой вы можете использовать предложение SQL RETURNING
из INSERT
в сочетании с предложением plpgsql INTO
. Пример:
Но вы явно пытаетесь обработать весь набор сразу.
рассчитать расстояние от адресных точек до всех улиц на расстоянии 50 метров...
Используйте наборный подход. Намного быстрее и чище. Если вы хотите вернуть строки из INSERT
, дополнительно используйте функции, возвращающие набор. Пример:
Вам вообще не нужна функция. Только этот запрос:
INSERT INTO street(ad_geom, st_geom, distance, traffic_ct) -- any columns in street
SELECT ad.geom, st.geom, ST_Distance(ad.geom, st.geom), ad.traffic_ct
FROM ad
LEFT JOIN st ON ST_DWithin(ad.geom, st.geom, 50.0)
RETURNING * -- all columns in street
Я думаю, вам больше не нужно ничего возвращать, поскольку этот запрос делает все, что вы хотели, но я оставил RETURNING
в качестве доказательства концепции. Вы можете просто пропустить это.
Используйте [INNER] JOIN
вместо LEFT [OUTER] JOIN
, если вы не хотите включать адреса без соответствующей улицы.
Руководство по RETURNING
в INSERT
:
Необязательное предложение RETURNING
заставляет INSERT
вычислять и возвращать значения на основе каждой фактически вставленной строки [...] разрешено любое выражение, использующее столбцы таблицы. Синтаксис списка RETURNING
идентичен выходному списку SELECT
. Будут возвращены только те строки, которые были успешно вставлены или обновлены.
Если вам нужно обернуть это в функцию plpgsql (также может быть простой функцией SQL) и при этом вернуть все строки:
CREATE OR REPLACE FUNCTION insert_neighbours()
RETURNS SETOF street AS
$func$
BEGIN
RETURN QUERY
INSERT INTO street(ad_geom, st_geom, distance, traffic_ct) -- any columns in street
SELECT ad.geom, st.geom, ST_Distance(ad.geom, st.geom), ad.traffic_ct
FROM ad
LEFT JOIN st ON ST_DWithin(ad.geom, st.geom, 50.0)
RETURNING *; -- all columns in street
END
$func$ LANGUAGE plpgsql;
Вызов:
SELECT * FROM insert_neighbours(); -- use SELECT * FROM ... !
Для простоты я возвращаю всю строку, но вы также можете вернуть выбранные столбцы. См. пример выше.
Создание функции не дает ошибки
Это связано с тем, что в настоящее время PL/pgSQL выполняет только поверхностные проверки синтаксиса CREATE FUNCTION
. Вы должны фактически выполнить функцию, чтобы протестировать ее, и убедиться, что все ветки кода в функциях plpgsql проверены.
person
Erwin Brandstetter
schedule
21.06.2016
ad
иst
(поскольку вы выбираете из них)? Пожалуйста, опишите более подробно, что вы пытаетесь выполнить. - person Laurenz Albe   schedule 20.06.2016