Как использовать цикл с функцией pgr_dijkstra
Я хочу использовать цикл для вычисления расстояния, пройденного между двумя узлами 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 ответ
Определите новую переменную (var_q) типа record, а затем выполните ваш запрос select в определенной вами переменной следующим образом 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