powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите написать рекурсивную функцию.
1 сообщений из 1, страница 1 из 1
Помогите написать рекурсивную функцию.
    #38812038
kalombo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
CREATE OR REPLACE FUNCTION get_nodes(node integer, nodes integer[])
  RETURNS integer[] AS
$BODY$
DECLARE
	current_node integer;
	row_data RECORD;
BEGIN
	FOR  row_data IN SELECT e1.id as n1, e2.id as n2 FROM link l
			    INNER JOIN snmp_ports s1 ON (s1.id = l.portid1)
			    INNER JOIN snmp_ports s2 ON (s2.id = l.portid2)
			    INNER JOIN equipment e1 ON (e1.id = s1.equipment)
			    INNER JOIN equipment e2 ON (e2.id = s2.equipment) 
			    WHERE e1.id = node or e2.id = node
			    LOOP
		
		IF row_data.n1=node THEN
			current_node := row_data.n2;
		ELSE
			current_node := row_data.n1;
		END IF;

		if NOT nodes @> ARRAY[current_node] THEN
			nodes := array_append(nodes, current_node);
			nodes := get_nodes(current_node, nodes);
		END IF;
	END LOOP;
	RETURN nodes;  
END
$BODY$
  LANGUAGE plpgsql VOLATILE

SELECT get_nodes(4840, '{}');



С помощью запроса в функции получаем все ребра графа, мне же нужно с помощью функции найти все вершины, которые связаны с вершиной node. Моих знаний пока хватило на создание вот такой рекурсивной функции, но в ней получается, что при каждом рекурсивном вызове этой функции срабатывает запрос, поэтому моя функция работает долгое количество времени. Как мне оптимизировать её? Я думаю, нужно считать данные запроса
Код: plsql
1.
2.
3.
4.
5.
SELECT e1.id as n1, e2.id as n2 FROM link l
			    INNER JOIN snmp_ports s1 ON (s1.id = l.portid1)
			    INNER JOIN snmp_ports s2 ON (s2.id = l.portid2)
			    INNER JOIN equipment e1 ON (e1.id = s1.equipment)
			    INNER JOIN equipment e2 ON (e2.id = s2.equipment



в массив и уже этот массив рекурсивно передавать. Правильный ли это вариант? Если да, то напишите его, пожалуйста, так как не могу разобраться в синтаксисе работы с многомерными массивами.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите написать рекурсивную функцию.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]