ORA-30009: недостаточно памяти для операции CONNECT BY / ORA-01788: в этом блоке запроса требуется условие CONNECT BY - PullRequest
2 голосов
/ 10 января 2020

Oracle newb ie здесь - я пытаюсь запустить оператор вставки, чтобы сгенерировать очень большой объем данных.

  1. Исходный запрос:
INSERT INTO HR.fastData (ID) 
SELECT 1 + (Level -1) * 1 
FROM dual connect by Level < 100000000;
Первая полученная ошибка:

ORA-30009: недостаточно памяти для операции CONNECT BY

Я следовал предоставленным здесь указаниям

Модифицированный запрос:

INSERT INTO HR.fastData (ID) 
SELECT 1 + (Level -1) * 1 
FROM
    (select level from dual connect by Level < 10000),
    (select level from dual connect by Level < 10000);
Следующая ошибка, которую я получил:

ORA-01788: в этом блоке запроса требуется условие CONNECT BY

Измененный запрос теперь выглядит следующим образом:
INSERT INTO HR.fastData (ID) 
SELECT 1 + (Level -1) * 1 
FROM DUAL CONNECT BY 
     (select Level from dual connect by Level < 10000),
     (select Level from dual connect by level < 10000);

Я не могу заставить его правильно работать после многих попыток различных вариантов запроса. Правильно ли я использую / размещаю оператор CONNECT BY? Буду признателен за любые рекомендации.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 января 2020

Похоже, что вы хотите запрос

SELECT ((lvl1-1)*10) + (lvl2-1) + 1 as ID
  FROM (select level as lvl1 from dual connect by Level <= 10000)
  CROSS JOIN (select level as lvl2 from dual connect by Level <= 10000);

Я не могу гарантировать, что ваша система может сгенерировать все эти числа в один go, но в принципе это будет работать. Вот db <> fiddle , которая показывает, что этот запрос работает, когда каждый подзапрос ограничен 10 уровнями, генерируя в общей сложности 100 строк.

1 голос
/ 10 января 2020
var x number;
exec :x := 10;
SELECT          level FROM dual connect by level <= :x
union all
select 1 * :x + level from dual connect by level <= :x
union all
select 2 * :x + level from dual connect by level <= :x
union all
select 3 * :x + level from dual connect by level <= :x;
...