Я пытаюсь создать функцию, которая принимает два параметра (road_class varchar, distance int), которая возвращает все точки, которые находятся в пределах определенного пользователем расстояния в m от определенного пользователем класса дороги.Ex.вызов функции будет выглядеть примерно так: fnc_pts_near_roads ('Track', 1000).
Я могу создать функцию, которая возвращает одну запись.Вот так:
CREATE TYPE pts_near_rds as (place_id integer, road_id integer, road
character varying, road_class character varying, place_names character
varying, distance_meters numeric, geom geometry);
CREATE OR REPLACE FUNCTION alc.fn_pts_near_roads(p_road_class character
varying, distance integer)
returns pts_near_rds
LANGUAGE plpgsql
AS $body$
DECLARE
rec pts_near_rds;
BEGIN
SELECT v_placename_place.place_id, road.road_id, road.road, road.road_class,
v_placename_place.place_names, st_distance(road.geom,
v_placename_place.geom), v_placename_place.geom
INTO rec.place_id, rec.road_id, rec.road, rec.road_class, rec.place_names,
rec.distance_meters, rec.geom
FROM road INNER JOIN v_placename_place
ON ST_DWithin(road.geom, v_placename_place.geom,$2)
WHERE road.road_class = $1;
RETURN rec;
END;
$body$
;
Я не могу, однако, заставить его вернуть все записи, где пользовательское условие истинно.Я пытался использовать RETURN TABLE и RETURN SETOF, но безрезультатно.Например, приведенный ниже запрос возвращает ошибку:
CREATE OR REPLACE FUNCTION alc.fn_near_road(p_road_class character varying,
distance integer)
RETURNS setof pts_near_rds AS $$
BEGIN
RETURN QUERY
SELECT v_placename_place.place_id, road.road_id, road.road,
road.road_class, v_placename_place.place_names, st_distance(road.geom,
v_placename_place.geom), v_placename_place.geom
FROM road INNER JOIN v_placename_place
ON ST_DWithin(road.geom, v_placename_place.geom,$2)
WHERE road.road_class = $1;
RETURN ;
END;
$$ LANGUAGE plpgsql;
Возвращает приведенную ниже ошибку.Я также пробовал другие комбинации - но продолжаю получать ошибки - и не знаю, где я иду не так.
SQL Error [42804]: ERROR: structure of query does not match function result
type Detail: Returned type text does not match expected type character
varying in column 5. Where: PL/pgSQL function fn_near_road(character
varying,integer) line 7 at RETURN QUERY.