powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CONNECT BY + dbms_random.value
14 сообщений из 14, страница 1 из 1
CONNECT BY + dbms_random.value
    #39415306
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Во многих рекурсивных запросах вижу вот это:
Код: 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
CONNECT BY + dbms_random.value
    #39415314
IMNO,

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

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

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

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

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

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

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

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

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

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
CONNECT BY + dbms_random.value
    #39417512
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deferred_segment_creation ?
...
Рейтинг: 0 / 0
CONNECT BY + dbms_random.value
    #39417577
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

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


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