如何在函数pgr_dijkstra中使用循环

时间:2018-11-01 12:56:40

标签: postgresql for-loop gis postgis pgrouting

我想使用循环来通过每次删除一个单元来计算两个节点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。

1 个答案:

答案 0 :(得分:0)

定义一个类型为record的新变量(var_q),然后对您定义的变量执行选择查询,例如Execute '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' into var_q 这可能会导致一些错误,因为我们必须对内部查询的引号进行转义,如果不可行,请尝试转义引号,然后可以像使用celref_blocked:= var_r.cel一样使用查询外的方式