我正在尝试创建一个带有两个参数的函数(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.