我有一个庞大的表,我需要转移到一个新表,我的资源不允许我这样做,我需要通过这样的数据分块来做到这一点:
DECLARE
TYPE prod_tab IS TABLE OF dba_tab_partitions%ROWTYPE;
products_tab prod_tab := prod_tab();
start_time number; end_time number;
BEGIN
SELECT * BULK COLLECT INTO products_tab FROM dba_tab_partitions WHERE table_name = 'TBLX'
EXECUTE IMMEDIATE 'TRUNCATE TABLE dba_tab_partitions2';
EXECUTE IMMEDIATE 'TRUNCATE TABLE tbl2';
FOR i in products_tab.first .. products_tab.last LOOP
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL DML PARALLEL 24';
INSERT /* PARALLEL(24) NOLOGGING */ INTO tbla2 NOLOGGING
(
"ID", datetime, ...)
SELECT /* PARALLEL(24) NOLOGGING */ * FROM tbl1 PARTITION(products_tab(i).partition_name);
COMMIT;
END LOOP;
COMMIT;
END;
有人可以帮我纠正吗?
答案 0 :(得分:0)
正如我在评论中已经说过的那样,我认为PARALLEL
没有任何意义(但我不确定)并且在复制整个表时逐个运行每个分区也没用。
无论如何,当你这样编写代码时,你的代码应该可以工作:
FOR i in products_tab.first .. products_tab.last LOOP
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL DML PARALLEL 24';
EXECUTE IMMEDIATE 'INSERT /*+ APPEND PARALLEL(24) */ INTO tbla2
("ID", datetime, ...)
SELECT *
FROM tbl1 PARTITION ('||products_tab(i).partition_name||)';
COMMIT;
END LOOP;
我不知道您的要求,但Exchanging Partitions and Subpartitions可能是您的选择。