如何在select语句中使用分区名作为参数?

时间:2017-10-26 16:18:01

标签: oracle

我有一个庞大的表,我需要转移到一个新表,我的资源不允许我这样做,我需要通过这样的数据分块来做到这一点:

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;

有人可以帮我纠正吗?

1 个答案:

答案 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可能是您的选择。