Oracle Loop Rule 4809 - PullRequest
       0

Oracle Loop Rule 4809

0 голосов
/ 10 июня 2019

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

Я использовал цикл for, в котором я сохраняюидентификатор последовательности в переменной, затем используйте его в моих вставках.

declare
first_id integer;
BEGIN
FOR texts in (select distinct text from table_texts  )
 LOOP
first_id := SEQ_IDS_OBJECTID.NEXTVAL;
INSERT INTO  table_1(id,some_fields)
VALUES (first_id, 'blablabla');

insert into table_2 (id,text_field)
 VALUES (first_id, texts.text);
END LOOP;
commit;
 END;

Я думаю, что это не идеальный способ достичь того, что мне нужно.Также, когда я ввожу код в TOAD, я получаю следующее предупреждение: Правило 4809 (цикл, содержащий операторы DML, должен быть реорганизован для использования BULK COLLECT и FORALL)

Есть ли лучший способ сделать это?

РЕДАКТИРОВАТЬ:

вышеуказанный код был упрощен.Но я думаю, что я должен раскрыть больше этого, чтобы объяснить случай:

declare
first_id  integer;
second_id integer;

BEGIN


FOR texts in (select distinct text1 , text2  from mdf )

LOOP

first_id := XAKTA.SEQ_IDS_OBJECTID.NEXTVAL;

select id_1 into second_id from table_3 where  field_1 =texts.text1 ;

INSERT INTO  table_1(id_1,id_2,some_fields)
VALUES (first_id ,second_id ,'blablabla');

insert into table_2 (id,text1,text2)
 VALUES (first_id, texts.text1,texts.text2);

END LOOP;    
commit;
 END;

1 Ответ

0 голосов
/ 10 июня 2019

Вы можете использовать FORALL для вставки партий элементов из вашего курсора:

DECLARE
  TYPE texts_tab IS TABLE OF table_texts.text%TYPE;
  TYPE ids_tab   IS TABLE OF table_2.id%TYPE;
  p_texts texts_tab;
  p_ids   ids_tab;
  CURSOR c IS
    SELECT DISTINCT text FROM table_texts;
BEGIN
  OPEN c;
  LOOP
    FETCH c BULK COLLECT INTO p_texts LIMIT 100;

    FORALL i IN 1 .. p_texts.COUNT
      INSERT INTO table_2 ( id, text_field )
                   VALUES ( SEQ_IDS_OBJECTID.NEXTVAL, p_texts(i) )
      RETURNING id BULK COLLECT INTO p_ids;

    FORALL i IN 1 .. p_ids.COUNT
      INSERT INTO  table_1( id, some_fields )
        VALUES ( p_ids(i), 'blablabla' );

    EXIT WHEN c%NOTFOUND;
  END LOOP;
  CLOSE c;
  COMMIT;
END;
/

db <> fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...