8c7f6c03

Обработка зациклености данных


Пример организации зациклености в сведениях о маршрутах: INSERT INTO route VALUES ( 'Новгород', 'Выборг', 135 );

Реакция на появление цикла (уже получается не иерархия) в этом случае отлична от имевшейся для CONNECT BY и будет: ERROR: ORA-32044: cycle detected while executing recursive WITH query

Упражнение. Проверить это самостоятельно.

Для предупреждения зацикливания вычислений вводится специальное указание CYCLE, где следует указать перечень (в общем случае) столбцов для распознавания хождения по кругу, придумать название столбца- индикатора (он автоматически включается в конечный ответ) и задать пару символов: для обозначения незацикленной строки и для обозначения строки, где было зафиксировано повторение значений в различительных столбцах: WITH stepbystep ( node, way, distance ) AS ( SELECT node, parent '-' node, distance FROM route WHERE parent = 'Москва' UNION ALL SELECT r.node , s.way '-' r.node , r.distance + s.distance FROM route r INNER JOIN stepbystep s ON ( s.node = r.parent ) ) CYCLE node SET cyclemark TO 'X' DEFAULT '-'

SELECT way, distance, cyclemark FROM stepbystep /

Ответ:

WAY DISTANCE C ------------------------------------------ ---------- - Москва-Ленинград 696 - Москва-Новгород 538 - Москва-Новгород-Ленинград 717 - Москва-Ленинград-Выборг 831 - Москва-Новгород-Ленинград-Выборг 852 - Москва-Ленинград-Выборг-Новгород 966 - Москва-Ленинград-Выборг-Новгород-Ленинград 1145 X

Москва-Новгород-Ленинград-Выборг-Новгород 987 X



Содержание раздела