–检查能否通过主键重定义:
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(‘RPT’, ‘RPT_CSUM_INV_SNP’, DBMS_REDEFINITION.CONS_USE_PK);
–获取建表语句:
select dbms_metadata.get_ddl(‘TABLE’,‘表名’,‘用户名’) from dual;
select dbms_metadata.get_ddl(‘TABLE’,‘RPT_CSUM_INV_SNP’,‘RPT’) from dual;
–创建临时表:
–调用dbms_redefinition包执行表的在线重定义:
EXEC DBMS_REDEFINITION.start_redef_table(‘RPT’,‘RPT_CSUM_INV_SNP’,‘RPT_CSUM_INV_SNP1’);
如果执行失败,需要回退:
EXEC dbms_redefinition.abort_redef_table(‘RPT’,‘RPT_CSUM_INV_SNP’,‘RPT_CSUM_INV_SNP1’);
–复制依赖对象:
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(‘RPT’, ‘RPT_CSUM_INV_SNP’,‘RPT_CSUM_INV_SNP1’, DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
–同步中间表,保证数据的一致性:
begin
dbms_redefinition.sync_interim_table(‘RPT’,‘RPT_CSUM_INV_SNP’,‘RPT_CSUM_INV_SNP1’);
end;
–完成重定义
begin
dbms_redefinition.finish_redef_table(‘RPT’,‘RPT_CSUM_INV_SNP’,‘RPT_CSUM_INV_SNP1’);
end;
–检查源表是否重定义成功
–删除临时表:
drop table RPT.RPT_CSUM_INV_SNP1;




