Как найти недостающие данные, которые вызывают ORA-01436 - PullRequest
1 голос
/ 27 февраля 2020

У меня есть запрос, чтобы увидеть родительский и дочерний иерархический список данных. При выполнении приведенного ниже запроса я получил ошибку ORA-01436.

SELECT ParentPropertyRSN, CONNECT_BY_ROOT PropertyRSN as PropertyRSN,
   LEVEL, SYS_CONNECT_BY_PATH(ParentPropertyRSN, '/') Path
FROM Property
   CONNECT BY PRIOR PropertyRSN = ParentPropertyRSN
   order by level desc;

Поэтому я добавил NOCYCLE в предложение CONNECT BY и получил полный список данных с его иерархическим путем

Теперь мне нужен запрос для получения списка строк с неточными данными, которые вызывают ORA-01436.

1 Ответ

5 голосов
/ 27 февраля 2020

Вы действительно должны использовать NOCYCLE, чтобы избежать бесконечного l oop. Вдобавок ко всему, вы можете использовать CONNECT_BY_ISCYCLE, чтобы идентифицировать ошибочные строки:

SELECT 
    ParentPropertyRSN, 
    CONNECT_BY_ROOT PropertyRSN as PropertyRSN,
    LEVEL, 
    SYS_CONNECT_BY_PATH(ParentPropertyRSN, '/') Path,
    CONNECT_BY_ISCYCLE Has_Cycle
FROM Property
CONNECT BY NOCYCLE PRIOR PropertyRSN = ParentPropertyRSN
ORDER BY level desc;

С документация :

The CONNECT_BY_ISCYCLE псевдостолбец возвращает 1, если в текущей строке есть дочерний элемент, который также является его предком. В противном случае он возвращает 0.

Вы можете указать CONNECT_BY_ISCYCLE, только если вы указали параметр NOCYCLE предложения CONNECT BY. NOCYCLE позволяет Oracle возвращать результаты запроса, который в противном случае потерпел бы неудачу из-за CONNECT BY l oop в данных.

...