当单表数据过大(几千万上亿数据量时)需要分批提交数据时使用,会有执行时间太久快照过旧的可能
declare
CURSOR CUR IS
SELECT * FROM reckondev.TB_TEST_SD --数据源
where inserttime>=p_starttime and inserttime<p_endtime ;
TYPE REC IS TABLE OF TB_TEST_SD%ROWTYPE; --获取表结构
RECS REC;
BEGIN
OPEN CUR;
WHILE (TRUE) LOOP
FETCH CUR BULK COLLECT
INTO RECS LIMIT 50000; --每5w行提交一次
FORALL I IN 1..RECS.COUNT
--追求速率开并行和nologging
INSERT/*+ append parallel 4 nologging */ INTO TB_TEST VALUES RECS(I); --目标表
COMMIT;
EXIT WHEN CUR%NOTFOUND;
END LOOP;
CLOSE CUR;
execute immediate 'alter table TB_TEST logging'; --恢复日志记录该表
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
-- 返回失败
dbms_output.put_line(sqlerrm||'->'||dbms_utility.format_error_backtrace);
end;