Для обработки одной строки или обработки строк по одному вы можете использовать предложение SQL RETURNING
INSERT
в сочетании с предложением plpgsql INTO
. Пример:
Но вы, очевидно, пытается обработать весь набор сразу.
calculate distance from address points to all streets within a distance of 50 meters ...
Используйте подход на основе набора. Много быстрее и чище. Если вы хотите вернуть строки из INSERT
дополнительно используйте функцию set-return. Пример:
Вам не нужно будет функцию вообще. Просто этот запрос:
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
, если вы не хотите включать адреса без соответствующей улицы.
The manual about RETURNING
in INSERT
:
The optional RETURNING
clause causes INSERT
to compute and return value(s) based on each row actually inserted [...] any expression using the table's columns is allowed. The syntax of the RETURNING
list is identical to that of the output list of SELECT
. Only rows that were successfully inserted or updated will be returned.
Если нужно обернуть это в функцию 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 ... !
Для простоты I retur n всю строку, но вы также можете вернуть столбцы выбора. See above example.
Creating the function gives no error
Это потому, что PL/PgSQL в настоящее время работает только поверхностные проверки синтаксиса на CREATE FUNCTION
. Вы должны фактически выполнить функцию для ее проверки - и убедитесь, что все ветви кода в функциях plpgsql прошли тестирование.
Пропустить все записи - ad/st или geometry ... В функции - если ad/st - геометрия, то перепишите внутренний выбор ... –
Как выполнить эту функцию без ошибок? Существуют ли в вашей базе данных таблицы 'ad' и' st' (поскольку вы выбираете из них)? Пожалуйста, опишите более подробно, что вы пытаетесь выполнить. –