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

Откуда: Middlebury, CT USA
Сообщений: 10039
This one is from OTN:

Brian Tkatch
I gave myself a small puzzle, to try to get the numbers 1-5 repeating as many times as their values: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5

My first attempt was quite simple. But i do not understand the results. Can someone explain to me why these are the results?


SQL> SELECT
  2     Rownum,
  3     A
  4  FROM
  5     (SELECT Rownum A FROM Dual CONNECT BY Rownum <= 5)
  6  CONNECT BY
  7     Rownum <= A;

    ROWNUM          A
---------- ----------
         1          1
         2          2
         3          3
         4          4
         5          5
         6          2
         7          3
         8          4
         9          5

9 rows selected.

I tried the following:

SQL> COLUMN PATH FORMAT A30
SQL> SELECT
  2     Rownum,
  3     A,
  4     REGEXP_REPLACE(SYS_CONNECT_BY_PATH(A,'-->'),'^...') PATH
  5  FROM
  6     (SELECT Rownum A FROM Dual CONNECT BY Rownum <= 5)
  7  CONNECT BY
  8     Rownum <= A;

    ROWNUM          A PATH
---------- ---------- ------------------------------
         1          1 1
         2          2 1-->2
         3          3 1-->2-->3
         4          4 1-->2-->3-->4
         5          5 1-->2-->3-->4-->5
         6          2 2
         7          3 3
         8          4 4
         9          5 5

9 rows selected.

SQL> 

Question is, how rows 6-9 got selected?

SY.

Сообщение было отредактировано: 29 фев 08, 03:21
29 фев 08, 03:19    [5352490]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
ыудусе
Member

Откуда: Владик
Сообщений: 126
Потому-что 6-9 руты иерархии, как и строка 1

Hierarchical Queries


Oracle then uses the information from these evaluations to form the hierarchy using the following steps:

1) Oracle selects the root row(s) of the hierarchy--those rows that satisfy the START WITH condition.

2) Oracle selects the child rows of each root row. Each child row must satisfy the condition of the CONNECT BY condition with respect to one of the root rows.

3) Oracle selects successive generations of child rows. Oracle first selects the children of the rows returned in step 2, and then the children of those children, and so on. Oracle always selects children by evaluating the CONNECT BY condition with respect to a current parent row.

4) If the query contains a WHERE clause without a join, then Oracle eliminates all rows from the hierarchy that do not satisfy the condition of the WHERE clause. Oracle evaluates this condition for each row individually, rather than removing all the children of a row that does not satisfy the condition.

5) Oracle returns the rows in the order shown in Figure 9-1. In the diagram, children appear below their parents. For an explanation of hierarchical trees, see Figure 3-1, "Hierarchical Tree".


  SELECT rownum,
    a,
    CASE WHEN ROWNUM <= a THEN 'TRUE' ELSE 'FALSE' END connect_condition,
    decode(connect_by_isleaf,   1,   'LEAF',   'NOT LEAF') leaf,
    LEVEL,
    regexp_replace(sys_connect_by_path(a,   '-->'),   '^...') path
  FROM
    (SELECT rownum a
     FROM dual CONNECT BY rownum <= 5)
  --START WITH a=1
  CONNECT BY rownum <= a;


ROWNUM  A    CONNECT_CONDITION LEAF     LEVEL  PATH              
------- ---- ----------------- -------- ------ ------------------
1       1    TRUE              NOT LEAF 1      1                 
2       2    TRUE              NOT LEAF 2      1-->2             
3       3    TRUE              NOT LEAF 3      1-->2-->3         
4       4    TRUE              NOT LEAF 4      1-->2-->3-->4     
5       5    TRUE              NOT LEAF 5      1-->2-->3-->4-->5 
6       2    FALSE             LEAF     1      2                 
7       3    FALSE             LEAF     1      3                 
8       4    FALSE             LEAF     1      4                 
9       5    FALSE             LEAF     1      5                 

9 rows selected


Но как-то непонятно, почему строка 5 NOT LEAF...
29 фев 08, 07:01    [5352545]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
Volder
Member

Откуда: Москва
Сообщений: 474
едем дальше:

может я что-то упустил в иерархиях, но почему здесь нормально зацикливает одну строку на себя и не возвращает никаких ORA-01436:

SQL> SELECT Rownum,
  2         A,
  3         ltrim(sys_connect_by_path(A, '-->'), '->'),
  4         connect_by_isleaf,
  5         connect_by_root(A)
  6    FROM (SELECT Rownum A FROM Dual CONNECT BY Rownum <= 5 order by 1 desc)
  7  CONNECT BY  Rownum <= A;

    ROWNUM          A LTRIM(SYS_CONNECT_BY_PATH(A,'-      CONNECT_BY_ISLEAF CONNECT_BY_ROOT(A)
---------- ---------- ----------------------------------- ----------------- ------------------
         1          5 5                                                   0                  5
         2          5 5-->5                                               0                  5
         3          5 5-->5-->5                                           0                  5
         4          5 5-->5-->5-->5                                       0                  5
         5          5 5-->5-->5-->5-->5                                   0                  5
         6          4 4                                                   1                  4
         7          3 3                                                   1                  3
         8          2 2                                                   1                  2
         9          1 1                                                   1                  1

9 rows selected

и еще нафига он здесь настойчиво просит NOCYCLE
причем если добавить в inline view NOCYCLE - то все пучком отрабатывает
SQL> SELECT Rownum,
  2         A,
  3         ltrim(sys_connect_by_path(A, '-->'), '->'),
  4         connect_by_isleaf,
  5         connect_by_root(A),
  6         connect_by_iscycle
  7    FROM (SELECT Rownum A FROM Dual CONNECT BY Rownum <= 5 order by 1 desc)
  8  CONNECT BY nocycle Rownum <= A;

...

ORA-30930: NOCYCLE keyword is required with CONNECT_BY_ISCYCLE pseudocolumn

SQL> 
29 фев 08, 12:45    [5354232]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
Elic
Member

Откуда:
Сообщений: 29976
Volder
может я что-то упустил в иерархиях, но почему здесь нормально зацикливает одну строку на себя и не возвращает никаких ORA-01436:
  7  CONNECT BY  Rownum <= A;
Потому что здесь нет prior как повода для ORA-01436.
STFF задачка: анаграммы на sql
29 фев 08, 14:05    [5354905]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
Volder
едем дальше:

может я что-то упустил в иерархиях, но почему здесь нормально зацикливает одну строку на себя и не возвращает никаких ORA-01436:

SQL> SELECT Rownum,
  2         A,
  3         ltrim(sys_connect_by_path(A, '-->'), '->'),
  4         connect_by_isleaf,
  5         connect_by_root(A)
  6    FROM (SELECT Rownum A FROM Dual CONNECT BY Rownum <= 5 order by 1 desc)
  7  CONNECT BY  Rownum <= A;

    ROWNUM          A LTRIM(SYS_CONNECT_BY_PATH(A,'-      CONNECT_BY_ISLEAF CONNECT_BY_ROOT(A)
---------- ---------- ----------------------------------- ----------------- ------------------
         1          5 5                                                   0                  5
         2          5 5-->5                                               0                  5
         3          5 5-->5-->5                                           0                  5
         4          5 5-->5-->5-->5                                       0                  5
         5          5 5-->5-->5-->5-->5                                   0                  5
         6          4 4                                                   1                  4
         7          3 3                                                   1                  3
         8          2 2                                                   1                  2
         9          1 1                                                   1                  1

9 rows selected

Цикл - это когда prior тот же.
А нет prior, нет и цикла.
29 фев 08, 14:09    [5354942]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
имхо, просто баг такой это. Лажа.
Кстати, элементарно лечится, если лажи чуток добавить.
(при удвоении - самоликвидируется )
SELECT
     Rownum,
     A,
     REGEXP_REPLACE(SYS_CONNECT_BY_PATH(A,'-->'),'^...') PATH
  FROM
     (SELECT Rownum A FROM Dual CONNECT BY Rownum <= 5)
 start with a <= rownum
  CONNECT BY
     Rownum <= A;
29 фев 08, 14:21    [5355040]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
Elic
Member

Откуда:
Сообщений: 29976
Ну и для полноты картины напомню sys_connect_by_path(rownum) с фильтрацией
29 фев 08, 14:22    [5355050]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
Elic
Member

Откуда:
Сообщений: 29976
orawish
имхо, просто баг такой это.
Не вижу никакого бага.
Кстати, ты кому отвечал?
orawish
Лажа.
Это вопрос веры :)
orawish
Кстати, элементарно лечится, если лажи чуток добавить.
Лечится не лажей, а использованием правильного псевдостолбца вместо rownum.
29 фев 08, 14:52    [5355317]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Elic
orawish
имхо, просто баг такой это.
Не вижу никакого бага.
Кстати, ты кому отвечал?

отвечал - автору (SY) - я жеж его скрипт цитировал
Elic

orawish
Лажа.
Это вопрос веры :)
orawish
Кстати, элементарно лечится, если лажи чуток добавить.
Лечится не лажей, а использованием правильного псевдостолбца вместо rownum.

:)
29 фев 08, 15:09    [5355473]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
Elic
Member

Откуда:
Сообщений: 29976
orawish
отвечал - автору (SY) - я жеж его скрипт цитировал
Ты его не цитировал :)
А "лажа" есть только в первичном невосприятии мозгом законого (как показал ыудусе) результата.
29 фев 08, 15:34    [5355673]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
ыудусе
Но как-то непонятно, почему строка 5 NOT LEAF...
Аналогично.

Сам-то oracle ведь понял (в коне концов), что нету child'ов, а нам не признается:(.
Может это как-то связано с недетерминированностью, если уместно так сказать, rownum?
29 фев 08, 16:08    [5355965]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Elic
orawish
отвечал - автору (SY) - я жеж его скрипт цитировал
Ты его не цитировал :)
А "лажа" есть только в первичном невосприятии мозгом законого (как показал ыудусе) результата.
ну, почему же только? А CONNECT_BY_ISLEAF?
29 фев 08, 16:11    [5355983]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
кстати, про лажу

Oracle® Database SQL Reference
10g Release 1 (10.1)
Part Number B10759-01
..
CONNECT_BY_ISLEAF Example

The following example shows the first three levels of the hr.employees table, indicating for each row whether it is a leaf row (indicated by 1 in the IsLeaf column) or whether it has child rows (indicated by 0 in the IsLeaf column):

SELECT last_name "Employee", CONNECT_BY_ISLEAF "IsLeaf",
LEVEL, SYS_CONNECT_BY_PATH(last_name, '/') "Path"
FROM employees
WHERE level <= 3 AND department_id = 80
START WITH last_name = 'King'
CONNECT BY PRIOR employee_id = manager_id AND LEVEL <= 4;

Employee IsLeaf LEVEL Path
--------------- ---------- ---------- -----------------------------------
King 1 1 /King
Russell 0 2 /King/Russell
Tucker 1 3 /King/Russell/Tucker
Bernstein 1 3 /King/Russell/Bernstein
Hall 1 3 /King/Russell/Hall
Olsen 1 3 /King/Russell/Olsen
Cambrault 1 3 /King/Russell/Cambrault
Tuvault 1 3 /King/Russell/Tuvault
Partners 0 2 /King/Partners
King 1 3 /King/Partners/King
Sully 1 3 /King/Partners/Sully
McEwen 1 3 /King/Partners/McEwen
Smith 1 3 /King/Partners/Smith
Doran 1 3 /King/Partners/Doran
Sewall 1 3 /King/Partners/Sewall
Errazuriz 0 2 /King/Errazuriz
Vishney 1 3 /King/Errazuriz/Vishney
...
29 фев 08, 16:29    [5356112]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Still, I do not see the right answer. I'll ask it in a different way: At what time in hierarchical queries ROWNUM is assigned? Keep in mind, WHERE clause in hierarchical queries is applied after the hierarchy is built. So question is what value is used as ROWNUM in CONNECT BY ROWNUM <= A?

SY.

Сообщение было отредактировано: 29 фев 08, 18:06
29 фев 08, 18:04    [5356733]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
Elic
Member

Откуда:
Сообщений: 29976
SY
Keep in mind, WHERE clause in hierarchical queries is applied after the hierarchy is built
В моей теме, ссылку на которую я привёл, растолковано, что на самом деле не после, а во время построения иерархии.
29 фев 08, 18:14    [5356777]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Elic
SY
Keep in mind, WHERE clause in hierarchical queries is applied after the hierarchy is built
В моей теме, ссылку на которую я привёл, растолковано, что на самом деле не после, а во время построения иерархии.


Well, I do not buy it :). Here is a hint:

SQL> COLUMN PATH FORMAT A30
SQL> SELECT
  2     ROWNUM,
  3     LEVEL,
  4     A,
  5     REGEXP_REPLACE(SYS_CONNECT_BY_PATH(A,'-->'),'^...') PATH
  6  FROM
  7     (SELECT LEVEL A FROM Dual CONNECT BY LEVEL <= 5 ORDER BY 1 DESC)
  8  CONNECT BY
  9     ROWNUM <= A;

    ROWNUM      LEVEL          A PATH
---------- ---------- ---------- ------------------------------
         1          1          5 5
         2          2          5 5-->5
         3          3          5 5-->5-->5
         4          4          5 5-->5-->5-->5
         5          5          5 5-->5-->5-->5-->5
         6          1          4 4
         7          1          3 3
         8          1          2 2
         9          1          1 1

9 rows selected.

SQL> COLUMN PATH FORMAT A30
SQL> SELECT
  2     ROWNUM,
  3     LEVEL,
  4     A,
  5     REGEXP_REPLACE(SYS_CONNECT_BY_PATH(A,'-->'),'^...') PATH
  6  FROM
  7     (SELECT LEVEL A FROM Dual CONNECT BY LEVEL <= 5 ORDER BY MOD(LEVEL,2))
  8  CONNECT BY
  9     ROWNUM <= A;

    ROWNUM      LEVEL          A PATH
---------- ---------- ---------- ------------------------------
         1          1          4 4
         2          2          4 4-->4
         3          3          4 4-->4-->4
         4          4          4 4-->4-->4-->4
         5          5          5 4-->4-->4-->4-->5
         6          1          2 2
         7          1          5 5
         8          1          1 1
         9          1          3 3

9 rows selected.

SQL> SELECT LEVEL A FROM Dual CONNECT BY LEVEL <= 5 ORDER BY MOD(LEVEL,2);

         A
----------
         4
         2
         5
         1
         3

SQL> 

SY.
29 фев 08, 18:16    [5356796]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
OK. I think I got it now. Rows 6-9 are there since CONNECT BY ROWNUM <= A does not apply to them. They are START WITH rows.

SY.

Сообщение было отредактировано: 29 фев 08, 18:38
29 фев 08, 18:37    [5356897]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
Volder
Member

Откуда: Москва
Сообщений: 474
Elic
Потому что здесь нет prior как повода для ORA-01436.
да это че-то я лишка дал, конечно

а вот про nocyle - тоже я не догоняю или Акелла (читай Oracle) все-таки промахнулся?
29 фев 08, 21:00    [5357205]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
ыудусе
Member

Откуда: Владик
Сообщений: 126
Elic
во время построения иерархии.


Кстати, вот

CREATE sequence tmp_log_seq;

CREATE TABLE tmp_log(rownum_call_num NUMBER(9),   rownum_call VARCHAR2(30),   rownum_value NUMBER(9));

CREATE OR REPLACE PROCEDURE tmp_rownum_log(in_call_name IN VARCHAR2,   in_i IN NUMBER) AS
pragma autonomous_transaction;
BEGIN
  INSERT
  INTO tmp_log(rownum_call,   rownum_value,   rownum_call_num)
  SELECT in_call_name,
    in_i,
    tmp_log_seq.nextval
  FROM dual;
  COMMIT;
END;

CREATE OR REPLACE FUNCTION tmp_rownum(in_call_name IN VARCHAR2,   in_i IN NUMBER) RETURN NUMBER AS
BEGIN
  tmp_rownum_log(in_call_name,   in_i);
  RETURN in_i;
END;

SELECT tmp_rownum('SELECT',   rownum) a
FROM dual CONNECT BY tmp_rownum('CONNECT',   rownum) <= 5

A                      
---------------------- 
1                      
2                      
3                      
4                      
5                      

5 rows selected

SELECT *
FROM tmp_log
ORDER BY rownum_call_num

ROWNUM_CALL_NUM        ROWNUM_CALL                    ROWNUM_VALUE           
---------------------- ------------------------------ ---------------------- 
1                      SELECT                         1                      
2                      CONNECT                        2                      
3                      SELECT                         2                      
4                      CONNECT                        3                      
5                      SELECT                         3                      
6                      CONNECT                        4                      
7                      SELECT                         4                      
8                      CONNECT                        5                      
9                      SELECT                         5                      
10                     CONNECT                        6                      

10 rows selected

ROWNUM_VALUE=6 в чём-то:) объясняет поведение SYS_CONNECT_BY_PATH

Аналогичный лог для

  SELECT tmp_rownum('SELECT',   rownum) tmp_rownum,
    a,
    decode(connect_by_isleaf,   1,   'LEAF',   'NOT LEAF') leaf,
    LEVEL,
    regexp_replace(sys_connect_by_path(a,   '-->'),   '^...') path
  FROM
    (SELECT tmp_rownum('INTERNAL SELECT',    rownum) a
     FROM dual CONNECT BY tmp_rownum('INTERNAL CONNECT',    rownum) <= 5)
  CONNECT BY tmp_rownum('CONNECT',   rownum) <= a;

TMP_ROWNUM  A    LEAF     LEVEL  PATH                 
----------- ---- -------- ------ ---------------------
1           1    NOT LEAF 1      1                    
2           2    NOT LEAF 2      1-->2                
3           3    NOT LEAF 3      1-->2-->3            
4           4    NOT LEAF 4      1-->2-->3-->4        
5           5    NOT LEAF 5      1-->2-->3-->4-->5    
6           2    LEAF     1      2                    
7           3    LEAF     1      3                    
8           4    LEAF     1      4                    
9           5    LEAF     1      5                    


ROWNUM_CALL_NUM        ROWNUM_CALL                    ROWNUM_VALUE           
---------------------- ------------------------------ ---------------------- 
1                      INTERNAL SELECT                1                      
2                      INTERNAL CONNECT               2                      
3                      INTERNAL SELECT                2                      
4                      INTERNAL CONNECT               3                      
5                      INTERNAL SELECT                3                      
6                      INTERNAL CONNECT               4                      
7                      INTERNAL SELECT                4                      
8                      INTERNAL CONNECT               5                      
9                      INTERNAL SELECT                5                      
10                     INTERNAL CONNECT               6                      
11                     CONNECT                        1                      
12                     SELECT                         1                      
13                     CONNECT                        2                      
14                     CONNECT                        2                      
15                     CONNECT                        2                      
16                     CONNECT                        2                      
17                     SELECT                         2                      
18                     CONNECT                        3                      
19                     CONNECT                        3                      
20                     CONNECT                        3                      
21                     CONNECT                        3                      
22                     CONNECT                        3                      
23                     CONNECT                        3                      
24                     SELECT                         3                      
25                     CONNECT                        4                      
26                     CONNECT                        4                      
27                     CONNECT                        4                      
28                     CONNECT                        4                      
29                     CONNECT                        4                      
30                     CONNECT                        4                      
31                     CONNECT                        4                      
32                     CONNECT                        4                      
33                     SELECT                         4                      
34                     CONNECT                        5                      
35                     CONNECT                        5                      
36                     CONNECT                        5                      
37                     CONNECT                        5                      
38                     CONNECT                        5                      
39                     CONNECT                        5                      
40                     CONNECT                        5                      
41                     CONNECT                        5                      
42                     CONNECT                        5                      
43                     CONNECT                        5                      
44                     SELECT                         5                      
45                     CONNECT                        6                      
46                     CONNECT                        6                      
47                     CONNECT                        6                      
48                     CONNECT                        6                      
49                     CONNECT                        6                      
50                     CONNECT                        6                      
51                     CONNECT                        6                      
52                     CONNECT                        6                      
53                     CONNECT                        6                      
54                     CONNECT                        6                      
55                     CONNECT                        6                      
56                     CONNECT                        6                      
57                     CONNECT                        6                      
58                     CONNECT                        6                      
59                     CONNECT                        6                      
60                     CONNECT                        6                      
61                     SELECT                         6                      
62                     CONNECT                        7                      
63                     CONNECT                        7                      
64                     CONNECT                        7                      
65                     CONNECT                        7                      
66                     CONNECT                        7                      
67                     CONNECT                        7                      
68                     CONNECT                        7                      
69                     CONNECT                        7                      
70                     CONNECT                        7                      
71                     CONNECT                        7                      
72                     SELECT                         7                      
73                     CONNECT                        8                      
74                     CONNECT                        8                      
75                     CONNECT                        8                      
76                     CONNECT                        8                      
77                     CONNECT                        8                      
78                     CONNECT                        8                      
79                     CONNECT                        8                      
80                     CONNECT                        8                      
81                     CONNECT                        8                      
82                     CONNECT                        8                      
83                     SELECT                         8                      
84                     CONNECT                        9                      
85                     CONNECT                        9                      
86                     CONNECT                        9                      
87                     CONNECT                        9                      
88                     CONNECT                        9                      
89                     CONNECT                        9                      
90                     CONNECT                        9                      
91                     CONNECT                        9                      
92                     CONNECT                        9                      
93                     CONNECT                        9                      
94                     SELECT                         9                      
95                     CONNECT                        10                     
96                     CONNECT                        10                     
97                     CONNECT                        10                     
98                     CONNECT                        10                     
99                     CONNECT                        10                     

99 rows selected

3 мар 08, 09:04    [5360629]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
ыудусе
Member

Откуда: Владик
Сообщений: 126
ROWNUM_VALUE=6 в чём-то:) объясняет поведение SYS_CONNECT_BY_PATH


читать как:
ROWNUM_VALUE=6 в чём-то:) объясняет поведение CONNECT_BY_ISLEAF
3 мар 08, 09:06    [5360630]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
Elic
Member

Откуда:
Сообщений: 29976
ыудусе
Elic
во время построения иерархии.
Кстати, вот
Мы, вообще-то, про where :)


ыудусе
ROWNUM_VALUE=6 в чём-то:) объясняет поведение CONNECT_BY_ISLEAF
Вряд ли. Контрпример:
create or replace function tmp_rownum(in_call_name in varchar2,   in_i in number) return number as
begin
  dbms_output.put_line(in_call_name);
  return in_i;
end;
/

select tmp_rownum('select  rownum='||rownum||', level='||level||', isleaf='||connect_by_isleaf, rownum) a, connect_by_isleaf
from dual connect by tmp_rownum('connect rownum='||rownum||', level='||level||', isleaf='||connect_by_isleaf,   level) <= 3
;
            A CONNECT_BY_ISLEAF
------------- -----------------
            1                 0
            2                 0
            3                 1

connect rownum=1, level=2, isleaf=0
select  rownum=1, level=1, isleaf=0
connect rownum=2, level=2, isleaf=0
connect rownum=2, level=3, isleaf=0
select  rownum=2, level=2, isleaf=0
connect rownum=3, level=3, isleaf=0
connect rownum=3, level=4, isleaf=0
select  rownum=3, level=3, isleaf=1
connect rownum=4, level=4, isleaf=1

select tmp_rownum('select  rownum='||rownum||', level='||level||', isleaf='||connect_by_isleaf, rownum) a, connect_by_isleaf
from dual connect by tmp_rownum('connect rownum='||rownum||', level='||level||', isleaf='||connect_by_isleaf,  rownum) <= 3
;
            A CONNECT_BY_ISLEAF
------------- -----------------
            1                 0
            2                 0
            3                 0

connect rownum=1, level=2, isleaf=0
select  rownum=1, level=1, isleaf=0
connect rownum=2, level=2, isleaf=0
connect rownum=2, level=3, isleaf=0
select  rownum=2, level=2, isleaf=0
connect rownum=3, level=3, isleaf=0
connect rownum=3, level=4, isleaf=0
select  rownum=3, level=3, isleaf=0
connect rownum=4, level=4, isleaf=0
3 мар 08, 12:51    [5362029]     Ответить | Цитировать Сообщить модератору
 Re: Can't explain this  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
SY
OK. I think I got it now. Rows 6-9 are there since CONNECT BY ROWNUM <= A does not apply to them. They are START WITH rows.

SY.
They are.
SELECT
   ROWNUM,
     LEVEL,
     A,
     REGEXP_REPLACE(SYS_CONNECT_BY_PATH(A,'-->'),'^...') PATH
  FROM
     (SELECT LEVEL A FROM Dual CONNECT BY LEVEL <= 5 ORDER BY 1 DESC)
  CONNECT BY 1=2

5 rows returned in 0,00 seconds
3 мар 08, 15:36    [5363149]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить