使用DBMS_REDEFINITION對已存在的表按月自動分區(qū)

參考1
參考2
參考3

創(chuàng)建分區(qū)臨時表

CREATE TABLE stocktaking2 (
  id                   NUMBER(10) not null,
  app_source           NUMBER(10) not null,
  batch_no             VARCHAR2(30) not null,
  stocktaking_date     DATE not null,
  inventory_class_id   NUMBER(10),
  inventory_class_code VARCHAR2(30) not null,
  inventory_class_name NVARCHAR2(100),
  store_id             NUMBER(10),
  store_code           VARCHAR2(30) not null,
  store_name           NVARCHAR2(100) not null,
  store_en_name        NVARCHAR2(100),
  item_id              NUMBER(10),
  item_code            VARCHAR2(30) not null,
  item_name            NVARCHAR2(100) not null,
  item_unit            VARCHAR2(30) not null,
  item_cost            NUMBER(20,6) not null,
  inventory_type_code  VARCHAR2(30) not null,
  inventory_type_name  NVARCHAR2(100),
  inventory_qty        NUMBER(20,6) not null,
  inventory_amount     NUMBER(20,6) not null,
  currency_id          NUMBER(10),
  currency_code        VARCHAR2(30) not null,
  comments             NVARCHAR2(100),
  status               NUMBER(10),
  imp_date             DATE not null,
  proc_status          NUMBER(10) not null,
  approve_status       NUMBER(10),
  approve_by           NUMBER(10),
  create_date          DATE not null,
  create_by            NUMBER(10) not null,
  update_date          DATE,
  update_by            NUMBER(10)
)
PARTITION BY RANGE (imp_date)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
( PARTITION p0 VALUES LESS THAN (TO_DATE('2016-01-01', 'YYYY-MM-DD'))--,
  --PARTITION p1 VALUES LESS THAN (TO_DATE('2016-02-01', 'YYYY-MM-DD')),
  --PARTITION p2 VALUES LESS THAN (TO_DATE('2016-03-01', 'YYYY-MM-DD')),
  --PARTITION p3 VALUES LESS THAN (TO_DATE('2016-04-01', 'YYYY-MM-DD')),
  --PARTITION p4 VALUES LESS THAN (TO_DATE('2016-05-01', 'YYYY-MM-DD')) 
);

由于這里使用了Oracle 11g的INTERVAL功能,所以PARTITION語句可以只寫一個

檢查是否可以進行REDEFINITION

EXEC DBMS_REDEFINITION.can_redef_table(USER, 'stocktaking');

開始 REDEFINITION

EXEC DBMS_REDEFINITION.start_redef_table(USER, 'stocktaking', 'stocktaking2');

創(chuàng)建索引和約束

SET SERVEROUTPUT ON
DECLARE
  l_errors  NUMBER;
BEGIN
  DBMS_REDEFINITION.copy_table_dependents(
    uname            => USER,
    orig_table       => 'stocktaking',
    int_table        => 'stocktaking2',
    copy_indexes     => DBMS_REDEFINITION.cons_orig_params,
    copy_triggers    => TRUE,
    copy_constraints => TRUE,
    copy_privileges  => TRUE,
    ignore_errors    => TRUE,
    num_errors       => l_errors,
    copy_statistics  => FALSE,
    copy_mvlog       => FALSE);
    
  DBMS_OUTPUT.put_line('Errors=' || l_errors);
END;
/

如果ignore_errors => FALSE, 在執(zhí)行該步時出現(xiàn)報錯,將ignore_errors設(shè)置為TRUE,忽略該錯誤。

  • ORA-01442: column to be modified to NOT NULL is already NOT NULL

完成 REDEFINITION

BEGIN
  dbms_redefinition.finish_redef_table(
    uname      => USER,        
    orig_table => 'stocktaking',
    int_table  => 'stocktaking2');
END;
/

驗證是否已經(jīng)分區(qū)

stocktaking表已經(jīng)被分區(qū)

SELECT partitioned FROM user_tables WHERE table_name = 'stocktaking';

-- 刪除臨時表stocktaking2
DROP TABLE stocktaking2;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容