Функция PostgreSQL / PostGIS;Выберите запрос, чтобы вернуть несколько записей - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь создать функцию, которая принимает два параметра (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.
...