oracle在线重定义之表结构
---首先创建一个源表
create table aa (a varchar2(8),bnumber(10),c varchar2(8));
insert into aa values('abc',10,'bca');
insert into aa values('ab',10,'bca');
insert into aa values('a',10,'bca');
--重定义的表必须要有主键
ALTER TABLE aa ADD CONSTRAINT PK_A PRIMARYKEY (A);
--创建一张中间表
create table bb (a varchar2(8),bVARCHAR2(10),c varchar2(8));
---进行检查源表的重定义
SQL> execDbms_Redefinition.can_redef_table ('scott',aa, dbms_redefinition.cons_use_pk );
PL/SQL procedure successfully completed
---开始重定义(列名必须要包含主键和要改字段的字段,使用to_number或to_char,不写的其他字段不会把数据复制过去)
SQL> execdbms_redefinition.start_redef_table ('scott',aa,bb,'a a,to_char(b) b,c c');
PL/SQL procedure successfully completed
--结束重定义
SQL> execdbms_redefinition.finish_redef_table('scott',aa,bb);
PL/SQL procedure successfully completed
中间遇到的几个报错解决方案
SQL> execdbms_redefinition.start_redef_table ('scott','AA','BB','a a,to_char(b) b');
begin dbms_redefinition.start_redef_table('scott','AA','BB','a a,to_char(b) b'); end;
ORA-12091: 不能联机重新定义具有实体化视图的表 "SCOTT"."AA"
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 50
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 1343
ORA-06512: 在 line 1
删除物化视图
drop materialized view log on aa;
SQL> execdbms_redefinition.start_redef_table ('scott','AA','BB','a a,to_char(b) b');
begin dbms_redefinition.start_redef_table('scott','AA','BB','a a,to_char(b) b'); end;
ORA-23539: 当前正在重新定义 "SCOTT"."AA" 表
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 50
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 1343
ORA-06512: 在 line 1
结束正在进行的重定义
SQL> execdbms_redefinition.abort_redef_table('scott','aa','bb');
PL/SQL procedure successfully completed