日期:2014-05-16 浏览次数:20453 次
创建一个非分区表,注意两个表的表结构和字段类型一致.
SQL> CREATE TABLE tab_unpart 2 ( 3 col1 varchar2(30), 4 col2 DATE 5 ); TABLE created.
SQL> INSERT INTO tab_unpart(col1, col2) SELECT -1, sysdate-365 FROM dual; 1 ROW created. SQL> INSERT INTO tab_unpart(col1, col2) SELECT 0, sysdate FROM dual; 1 ROW created. SQL> INSERT INTO tab_unpart(col1, col2) SELECT +1, sysdate+360 FROM dual; 1 ROW created. SQL> commit; Commit complete. SQL> SELECT col1,to_char(col2,'yyyy-mm-dd') FROM tab_unpart; COL TO_CHAR(CO --- ---------- -1 2011-01-05 0 2012-01-05 1 2012-12-30
SQL> CREATE TABLE tab_part 2 ( 3 col1 varchar2(30), 4 col2 DATE 5 ) 6 partition BY range(col2) 7 ( 8 partition tab_part_2011 VALUES less than (to_date('2011-01-01','yyyy-mm-dd')), 9 partition tab_part_2012 VALUES less than (to_date('2012-01-01','yyyy-mm-dd')), 10 partition tab_part_2013 VALUES less than (to_date('2013-01-01','yyyy-mm-dd')), 11 ); TABLE created. SQL> @partition_ NAME OBJECT COLUMN_NAME PARTITIONING_TYPE STATUS PARTITION_NAME --------------- ------ ----------- -------------------- ------- --------------- TAB_PART TABLE COL2 RANGE VALID TAB_PART_2013 TAB_PART TABLE COL2 RANGE VALID TAB_PART_2011 TAB_PART TABLE COL2 RANGE VALID TAB_PART_2012
SQL> EXEC dbms_redefinition.can_redef_table('TEST','TAB_UNPART',1); BEGIN dbms_redefinition.can_redef_table('TEST','TAB_UNPART',1); END; * ERROR at line 1: ORA-12089: cannot online redefine TABLE "TEST"."TAB_UNPART" WITH no PRIMARY KEY ORA-06512: at "SYS.DBMS_REDEFINITION", line 139 ORA-06512: at "SYS.DBMS_REDEFINITION", line 1782 ORA-06512: at line 1
SQL> ALTER TABLE TAB_UNPART ADD CONSTRAINT pk_unpart_col1 PRIMARY KEY (COL1); TABLE altered. SQL> ALTER TABLE TAB_PART ADD CONSTRAINT pk_part_col1 PRIMARY KEY (COL1); TABLE altered.
SQL> EXEC dbms_redefinition.can_redef_table('TEST','TAB_UNPART',1); PL/SQL PROCEDURE successfully completed.
SQL> @partition_ NAME OBJECT COLUMN_NAME PARTITIONING_TYPE STATUS PARTITION_NAME --------------- ------ ----------- -------------------- ------- --------------- TAB_PART TABLE COL2 RANGE VALID TAB_PART_2013 TAB_PART TABLE COL2 RANGE VALID TAB_PART_2011 TAB_PART TABLE COL2 RANGE VALID TAB_PART_2012 SQL> BEGIN 2 DBMS_REDEFINITION.CAN_REDEF_TABLE('TEST','TAB_UNPART',2); 3 DBMS_REDEFINITION.START_REDEF_TABLE('TEST','TAB_UNPART','TAB_PART',NULL,2); 4 DBMS_REDEFINITION.FINISH_REDEF_TABLE('TEST','TAB_UNPART','TAB_PART'); 5 END; 6 / PL/SQL PROCEDURE successfully completed. SQL> @partition_ NAME OBJECT COLUMN_NAME PARTITIONING_TYPE STATUS PARTITION_NAME --------------- ------ ----------- -------------------- ------- --------------- TAB_UNPART TABLE COL2 RANGE VALID TAB_PART_2013 TAB_UNPART TABLE COL2 RANGE VALID TAB_PART_2011 TAB_UNPART TABLE COL2 RANGE VALID TAB_PART_2012
SQL> SELECT * FROM tab_unpart partition (TAB_PART_2012); COL COL2 --- ------------ -1 05-JAN-11 SQL> SELECT * FROM tab_unpart partition (TAB_PART_2011); no ROWS selected SQL> SELECT * FROM tab_unpart partition (TAB_PART