【问题标题】:how to use a loop with the function pgr_dijkstra如何使用带有函数 pgr_dijkstra 的循环
【发布时间】: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


【解决方案1】:

定义一个记录类型的新变量(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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2015-10-27
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多