网上已经有很多在线重定义表的例子,但是大多基于主键进行的,其实oracle也支持rowid的方式进行重定义,下面就简单举个例子.
[@more@]SQL> create table demo_1 (id number);
表已创建。
SQL> insert into demo_1 values (1);
已创建 1 行。
SQL> insert into demo_1 values (2);
已创建 1 行。
SQL> insert into demo_1 values (2);
已创建 1 行。
SQL> insert into demo_1 values (3);
已创建 1 行。
SQL> insert into demo_1 values (3);
已创建 1 行。
SQL> commit;
提交完成。
SQL> execute dbms_redefinition.can_redef_table('scott','demo_1',dbms_redefinitio
n.cons_use_rowid);
PL/SQL 过程已成功完成。
SQL> select * from demo_1;
ID
----------
1
2
2
3
3
SQL> create table demo_2 (id number,name varchar2(10));
表已创建。
SQL> execute dbms_redefinition.start_redef_table('scott','demo_1','demo_2','id i
d',dbms_redefinition.cons_use_rowid);
PL/SQL 过程已成功完成。
SQL> execute dbms_redefinition.finish_redef_table('scott','demo_1','demo_2');
PL/SQL 过程已成功完成。
注意: 对于采用了ROWID方式重定义的表,在demo_1中会生成一个隐含列M_ROW$$ (直接查表是看不见的,只能查底层字典表)
SQL> select col#,name,type# from SYS.COL$ WHERE OBJ#=
2 (select object_id from dba_objects where object_name='DEMO_1');
COL# NAME TYPE#
---------- ------ ----------
1 ID 2
2 NAME 1
0 M_ROW$$ 1
可以通过以下语句来除掉这个字段:
SQL> alter table demo_1 set unused (m_row$$);
表已更改。
SQL> alter table demo_1 drop unused columns;
表已更改。
SQL> select col#,name,type# from SYS.COL$ WHERE OBJ#=
2 (select object_id from dba_objects where object_name='DEMO_1');
COL# NAME TYPE#
---------- ------- ---------
1 ID 2
2 NAME 1
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/3898/viewspace-840878/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/3898/viewspace-840878/