【发布时间】:2018-11-01 12:56:40
【问题描述】:
我想通过每次删除一个单元格来使用循环来计算两个节点 152 和 17720 之间的行进距离(我使用函数 pgr_dijkstra)。一个单元格包含多个道路链接。 grid_edges_routard 表包含道路链接和相应的单元格。 我想为每个阻塞的单元格设置两个节点之间的距离。 我必须使用 pgr_dijkstra 在第二次显示链接经过。
CREATE OR REPLACE FUNCTION get_dist_grid()
RETURNS TABLE (
celref_blocked INT,
dist INT
) AS $$
DECLARE
var_r record;
BEGIN
FOR var_r IN(SELECT distinct(cellule)as cel from grid_edges_routard )
LOOP
SELECT * FROM pgr_dijkstra('SELECT id, source, target,cost
FROM road_routard.edges_vulnerabilite
where id not in (select edge_id
from grid_edges_routard
where cellule=var_r) ',152 ,17720, FALSE)
where edge=-1;
celref_blocked := var_r.cel ;
RETURN NEXT;
END LOOP;
END; $$
LANGUAGE 'plpgsql';
select get_dist_grid()
我收到一条错误消息:错误:列« var_r » 不存在。 我使用 postgresql 9.5。
【问题讨论】:
-
在您的选择查询中尝试 '||var_r||'你有 cellule=var_r
-
感谢您的回答。我更改了 select query
select edge_id from grid_edges_routard where cellule='||var_r||') ',152 ,17720, FALSE)
但我收到另一条错误消息 ERROR: the request has no destination for the results data提示:如果要取消 SELECT 的结果,请改用 PERFORM。 CONTEXT:PL/pgsql 函数 get_dist_grid0(),第 8 行到 SQL 语句 -
定义一个记录类型的新变量(var_q),然后像这样对定义的变量执行选择查询 Execute 'SELECT * FROM pgr_dijkstra(''SELECT id, source, target,cost FROM road_routard. edge_vulnerabilite where id not in (select edge_id from grid_edges_routard where cellule='''||var_r||''') '',152 ,17720, FALSE) where edge=-1' into var_q
-
这可能会产生一些错误,因为我们必须为内部查询转义引号,如果它不起作用,请尝试转义引号,然后您可以以与您使用过的类似方式使用查询外celref_blocked := var_r.cel
-
非常感谢它的工作,除了我想要两列结果 RETURNS TABLE (celref_blocked INT, dist float) 但我只有一列包含两个结果为 (celref_blocked, dist)
标签: postgresql for-loop gis postgis pgrouting