PostgreSQL / PostGIS功能;选择查询以返回多个记录

时间:2019-02-03 20:33:00

标签: postgresql function return-value postgis plpgsql

我正在尝试创建一个带有两个参数的函数(road_class varchar,disting int),该函数返回位于用户定义的道路类中以m为单位的用户定义距离内的所有点。例如函数调用如下所示: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.

0 个答案:

没有答案