Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 connect_by_iscycle или не cycle  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
drop table foo_emp

Table dropped. 0,08 seconds
--------------------------------------------------------------------------------

create table foo_emp as 
  select empno, ename, nvl(mgr,7934) mgr
    from emp


Table created. 0,07 seconds
--------------------------------------------------------------------------------

select * from foo_emp

14 rows selected. 0,02 seconds
--------------------------------------------------------------------------------
EMPNOENAMEMGR
7839KING7934
7698BLAKE7839
7782CLARK7839
7566JONES7839
7788SCOTT7566
7902FORD7566
7369SMITH7902
7499ALLEN7698
7521WARD7698
7654MARTIN7698
7844TURNER7698
7876ADAMS7788
7900JAMES7698
7934MILLER7782


select level,  e.*  
  from foo_emp e
  connect by prior empno = mgr 
  start with empno =7782


ORA-01436: CONNECT BY loop in user data
--------------------------------------------------------------------------------
Отлично, теперь найдем этот цикл:
select * from
  (select level, connect_by_iscycle cycle_flag, e.*  
    from foo_emp e
    connect by nocycle prior empno = mgr 
    start with empno =7782)
where cycle_flag =1

no data found

Statement processed. 0,08 seconds
--------------------------------------------------------------------------------
:((
Но все же он существует:
select * from
  (select level, connect_by_iscycle cycle_flag, e.*  
    from foo_emp e
    connect by nocycle prior empno = mgr 
    start with empno =7934)
where cycle_flag =1


LEVEL CYCLE_FLAG EMPNO ENAME MGR 
3 1 7782 CLARK 7839 


Statement processed. 0,02 seconds 
 
Баг или что-то я не понимаю в The CONNECT_BY_ISCYCLE pseudocolumn returns 1 if the current row has a child which is also its ancestor. Otherwise it returns 0. ?
30 янв 07, 11:44    [3711872]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
Elic
Member

Откуда:
Сообщений: 29990
Посмотри задачка: анаграммы на sql
30 янв 07, 11:51    [3711921]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
Посмотрел.
SY> And that explains why CONNECT_BY_ISCYCLE is set to 1 for the last row in first iteration of the loop. Otherwise, we would not get 1 at all.

Понял так, что CONNECT_BY_ISCYCLE =1 только для одной записи цикла- той, где ORACLE собственно и наткнется на эту неприятность.
Однако как это может зависеть от начальной точки
... start with empno =7782
или
... start with empno =7934
если обе входят в один и тот же цикл?
30 янв 07, 12:21    [3712184]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
Elic
Member

Откуда:
Сообщений: 29990
ModelR
Понял так, что CONNECT_BY_ISCYCLE =1 только для одной записи цикла- той, где ORACLE собственно и наткнется на эту неприятность.
А как иначе. Строка уже в result-set-е. Обнаружится ли в её детях цикл - ещё неизвестно.
System@Elic10> create table tmp as select level as id, decode(level, 1, 4, level - 1) as parent
System@Elic10>   from dual connect by level <= 4;

Table created.

System@Elic10> select * from tmp;

     ID        PARENT
------- -------------
      1             4
      2             1
      3             2
      4             3

System@Elic10> select id, parent, level from tmp start with id = 1 connect by parent = prior id;
ERROR:
ORA-01436: CONNECT BY loop in user data

no rows selected

System@Elic10> var id number
System@Elic10> exec :id := 1

PL/SQL procedure successfully completed.

System@Elic10> select *
System@Elic10>   from
System@Elic10>   ( select id, parent, level, connect_by_iscycle as is_cycle
System@Elic10>       from tmp
System@Elic10>       start with id = :id
System@Elic10>       connect by nocycle parent = prior id
System@Elic10>   )
System@Elic10>   where is_cycle = 1
System@Elic10> ;

     ID        PARENT         LEVEL      IS_CYCLE
------- ------------- ------------- -------------
      4             3             4             1

System@Elic10> exec :id := 2

PL/SQL procedure successfully completed.

System@Elic10> /

     ID        PARENT         LEVEL      IS_CYCLE
------- ------------- ------------- -------------
      1             4             4             1

System@Elic10> exec :id := 3

PL/SQL procedure successfully completed.

System@Elic10> /

     ID        PARENT         LEVEL      IS_CYCLE
------- ------------- ------------- -------------
      2             1             4             1

System@Elic10> exec :id := 4

PL/SQL procedure successfully completed.

System@Elic10> /

     ID        PARENT         LEVEL      IS_CYCLE
------- ------------- ------------- -------------
      3             2             4             1

ModelR
Однако как это может зависеть от начальной точки
От начальной точки должна зависеть только конечная:
System@Elic10> define _O_VERSION
DEFINE _O_VERSION      = "Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options" (CHAR)
30 янв 07, 13:25    [3712761]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
Elic
От начальной точки должна зависеть только конечная:
Дык и я так думал.
А вот получил no data found для одной из них.
Т.е при некоторых условиях ORACLE цикл находит, но где - не признается :((
Вопрос - при каких?
30 янв 07, 13:40    [3712921]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
Bely
Member

Откуда: Москва
Сообщений: 1903
ModelR
Elic
От начальной точки должна зависеть только конечная:
Дык и я так думал.
А вот получил no data found для одной из них.
Т.е при некоторых условиях ORACLE цикл находит, но где - не признается :((
Вопрос - при каких?
Неплохо бы начать поиск с вашей версии оракла :)
30 янв 07, 13:58    [3713139]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
select level,  connect_by_iscycle cycle_flag, e.*  
    from foo_emp e
    connect by nocycle prior empno = mgr 
    start with empno =7782

LEVELCYCLE_FLAGEMPNOENAMEMGR
107782CLARK7839
207934MILLER7782
307839KING7934<---Разве здесь не должна быть 1 ?
407698BLAKE7839
507499ALLEN7698
507521WARD7698
507654MARTIN7698
507844TURNER7698
507900JAMES7698
407566JONES7839
507788SCOTT7566
607876ADAMS7788
507902FORD7566
607369SMITH7902
30 янв 07, 13:59    [3713151]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
BANNER
Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - Prod
30 янв 07, 14:01    [3713188]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
Bely
Member

Откуда: Москва
Сообщений: 1903
Похоже, что это связано с тем, что у 7782 - нет потомков, которые НЕ входят в цикл,
а у 7839 - есть такие потомки.

т.е. Он и в цикле и не в цикле одновременно.
30 янв 07, 14:06    [3713239]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
Bely
Похоже, что это связано с тем, что у 7782 - нет потомков, которые НЕ входят в цикл,
Очень похоже. Т.е. iscycle = iscycleONLY .
ИМХО зря это.
30 янв 07, 14:34    [3713527]     Ответить | Цитировать Сообщить модератору
 Re: connect_by_iscycle или не cycle  [new]
Elic
Member

Откуда:
Сообщений: 29990
ModelR
Bely
Похоже, что это связано с тем, что у 7782 - нет потомков, которые НЕ входят в цикл,
Очень похоже. Т.е. iscycle = iscycleONLY .
ИМХО зря это.
Bug No. 3875550: CONNECT_BY_ISCYCLE DOES NOT RETURN CORRECT VALUE: "Fixed in 10.2"
30 янв 07, 16:00    [3714329]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить