Процедура: зафиксировать после 10000 записей

CREATE OR REPLACE PROCEDURE testing AS
BEGIN

    insert into t3 select * from t2;

    insert into t1 select * from t4;

commit;
EXCEPTION WHEN OTHER THEN
     ROLLBACK;
END;

Это будет работать нормально

t2 - 3 миллиона t4 - 3 миллиона всего у меня 6 миллионов записей, по какой-то причине мое временное пространство заполняется так, что я хочу сделать коммит после вставки каждых 10000 записей.

как сделать?

2 ответа

Надеюсь, этот фрагмент поможет.

--Test data creation
CREATE TABLE TEST_SO_BULK
AS
SELECT LEVEL COL1,'AVRAJIT'||LEVEL COL2 FROM DUAL
CONNECT BY LEVEL < 100000;


--Create another table to insert

CREATE TABLE TEST_SO1
AS
SELECT * FROM TEST_SO_BULK
WHERE 1=2;


--Bulk collect with limit clause
set serveroutput on;
DECLARE
TYPE lv
IS
  TABLE OF TEST_SO_BULK%ROWTYPE;
  lv_tab lv;
  CURSOR lvsql IS
  SELECT * FROM TEST_SO_BULK;
BEGIN
  OPEN lvsql;
  LOOP
  FETCH lvsql BULK COLLECT INTO lv_tab LIMIT 10000;
  dbms_output.put_line(lv_tab.COUNT);
  FORALL i IN lv_tab.FIRST..lv_tab.LAST
  INSERT INTO TEST_SO1 VALUES
  (
  lv_tab(i).col1,
  lv_tab(i).col2
  );
  EXIT WHEN lvsql%NOTFOUND;
  END LOOP; 
END;

--Check data count
select count(1) from test_so1;

Я хотел бы использовать BULK COLLECT а также FORALL,

См. " Инкрементная обработка фиксации с помощью FORALL" и " Массовая обработка с помощью BULK COLLECT" и "FORALL" для некоторых примеров, которые вы можете адаптировать для своего случая.

Другие вопросы по тегам