Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CONNECT BY + dbms_random.value / 14 сообщений из 14, страница 1 из 1
07.03.2017, 11:11
    #39415306
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
Здравствуйте!
Во многих рекурсивных запросах вижу вот это:
Код: plsql
1.
prior dbms_random.value is not null



Для чего тут используется рандом? Как вообще можно применять рандом в запросах? Что за магия?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t as (
select 'a;б;в' as str, 1 as id from dual
union all
select 'г;д;' as str, 2  from dual
union all
select null as str, 3 from dual
union all
select 'p' as str, 4 from dual
 )
select regexp_substr(str, '[^;]+', 1, level) str2 , t.*, level, level -1 from t
CONNECT BY instr(trim(';' from str), ';', 1, level - 1) > 0
 and prior id = id
and prior dbms_random.value is not null;
...
Рейтинг: 0 / 0
07.03.2017, 11:17
    #39415314
CONNECT BY + dbms_random.value
IMNO,

без него будет лупс и соответствующая ошибка. как раз для разлупливания иерархического запроса, используемого в качестве генератора стриок, и используют эту конструкцию
...
Рейтинг: 0 / 0
07.03.2017, 11:25
    #39415322
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
То что без него будет ошибка я знаю. Если убрать эту строку с рандомом и попытаться выполнить запрос, то выбросит ошибку, что рекурсия не может выйти из цикла.
Меня интересует как запрос вообще может корректно отработать, если он зависит от случайных чисел.
...
Рейтинг: 0 / 0
07.03.2017, 11:35
    #39415332
CONNECT BY + dbms_random.value
IMNO,

он не зависит от "случайных" чисел..... он их использует для создания "уникальности" каждого уровня иерархии.
именно потому, что это случайные числа - каждый уровень перестает быть "одинаковым" и цикла не возникает.
...
Рейтинг: 0 / 0
07.03.2017, 15:25
    #39415566
arlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
то есть, теоретически возможно, что когда-нибудь выстрелит?
...
Рейтинг: 0 / 0
07.03.2017, 15:58
    #39415598
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
arlx,

Ну если ты нагенеришь гугол значений, то совпадения неизбежны, а вот два подряд это уже чересчур.
IMNOЧто за магия?В доке есть четкое определение цикла и был придуман вполне конкретный подход, чтоб идентификация цикла давала отрицательный результат.

PS. Более элегантно использовать sys_guid чтоб обойтись без PL/SQL.
...
Рейтинг: 0 / 0
07.03.2017, 16:15
    #39415607
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
dbms_photoshopчтоб идентификация цикла давала отрицательный результатпогодите, а как же NOCYCLE?
...
Рейтинг: 0 / 0
07.03.2017, 16:30
    #39415612
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
--Eugene--,

Ну ты же можешь добавить в запрос TC nocycle, убрать prior random и посмотреть что получится.

Я описывал специфику работы подробно в The Power of Oracle SQL .
...
Рейтинг: 0 / 0
09.03.2017, 08:29
    #39415999
arlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
[quot dbms_photoshop]arlx,
Ну если ты нагенеришь гугол значений, то совпадения неизбежны, а вот два подряд это уже чересчур.

а как же: 12707986
...
Рейтинг: 0 / 0
09.03.2017, 13:30
    #39416169
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
arlx,

seed не заметил?
...
Рейтинг: 0 / 0
09.03.2017, 16:13
    #39416286
фкдч
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
dbms_photoshop,

нет. вон оно чо.
...
Рейтинг: 0 / 0
11.03.2017, 23:30
    #39417454
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
фкдч,

C seed правда тоже бывали баги.

11.2.0.1, при вставке первая строка пропала
Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
SQL> exec dbms_random.seed(1);

PL/SQL procedure successfully completed.

SQL> select rownum, trunc(1000 * dbms_random.value + 1) value
  2    from dual
  3  connect by rownum <= 10;

    ROWNUM      VALUE
---------- ----------
         1        751
         2        861
         3        366
         4         14
         5        565
         6        228
         7        885
         8        660
         9        692
        10        238

10 rows selected.

SQL> create table t(id int, value number);

Table created.

SQL> exec dbms_random.seed(1);

PL/SQL procedure successfully completed.

SQL> insert into t
  2  select rownum, trunc(1000 * dbms_random.value + 1) value
  3    from dual
  4  connect by rownum <= 10;

10 rows created.

SQL> select * from t;

        ID      VALUE
---------- ----------
         1        861
         2        366
         3         14
         4        565
         5        228
         6        885
         7        660
         8        692
         9        238
        10        617

10 rows selected.
...
Рейтинг: 0 / 0
12.03.2017, 06:13
    #39417512
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
deferred_segment_creation ?
...
Рейтинг: 0 / 0
12.03.2017, 13:26
    #39417577
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CONNECT BY + dbms_random.value
Вячеслав Любомудров,

Да, это из-за него. Так что не баг.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CONNECT BY + dbms_random.value / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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