как использовать цикл с функцией pgr_dijkstra - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу использовать цикл для вычисления расстояния, пройденного между двумя узлами 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 голосов
/ 12 ноября 2018

Определите новую переменную (var_q) типа record, затем выполните ваш запрос на выборку в заданную вами переменную, как это 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

...