OR REPLACE FUNCTION return_table( double precision, double precision, double precision, double precision) RETURNS table(distance double precision) AS
$$
DECLARE
result1 double precision;
result2 double precision;
BEGIN
result1 = $1;
result2 = $2;
DROP TABLE IF EXISTS ogr_tmp;
CREATE TEMP TABLE ogr_tmp (id integer, source integer, target integer, cost double precision, reverse_cost double precision);
INSERT INTO ogr_tmp SELECT id, source, target, cost, reverse_cost FROM mymatview2 as r WHERE ST_DWithin(geom_way, ST_GeomFromEWKT('SRID=4326;POINT(37.437280 55.672250)'), 1);
RETURN QUERY
WITH source_tmp AS (SELECT source
FROM hh_2po_4pgr
ORDER BY geom_way <-> ST_SetSRID(ST_MakePoint($1, $2), 4326) ASC
LIMIT 1
),
target_tmp AS (SELECT target
FROM hh_2po_4pgr
ORDER BY geom_way <-> ST_SetSRID(ST_MakePoint($3, $4), 4326) ASC
LIMIT 1
)
SELECT SUM(rd.km) as distance
FROM pgr_dijkstra('SELECT * FROM ogr_tmp as r ',
(SELECT source FROM source_tmp) , (SELECT target FROM target_tmp), true) AS r
JOIN hh_2po_4pgr rd ON r.edge = rd.id ;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM return_table(37.437280, 55.672250, 37.902600, 55.662700);
В этом месте:
POINT(37.437280 55.672250)
Пробовал:
POINT($1 $2)
POINT('result1' 'result2')
не хочет принимать, как подставить переменную?
Через всяческий string concatenation. 'SRID=4326;POINT(' || $1 || ' ' || $2 || ')' и всё такое (не знаю, нормально ли телеграм сейчас пропустит два символа пайпа, но суть там в объединении строк). Но, право, что-то вас понесло куда-то на ночь глядя. Таблицы какие-то временные, функцыи для них, вот это всё. Суньте вашу CTE внутрь строки запроса, она там точно такая жэ, как и во внешнем запросе будет. (Кстати, с точки зрения результата CTE без RECURSIVE -- это всего лишь синтаксический сахар, того жэ самого можно добиться вставляя запрос непосредственно во FROM).
Обсуждают сегодня