这其实是两个问题,
1.varchar2字段是可以用于定义range分区的
2.在线重定义与你用什么东西分区没有关系,只要老表有主键(没有主键用ROWID也行,不过会麻烦一点),新定义的表能create出来,一般就能转
测试如下
CREATE TABLE table_o (ID NUMBER PRIMARY KEY, TIME varchar2(20))
;
insert into table_o values(123,'2021-01-03 12:00:00');
commit;
CREATE TABLE table_n (ID NUMBER PRIMARY KEY, TIME varchar2(20))
PARTITION BY RANGE (TIME)
(PARTITION P1 VALUES LESS THAN ('2021-01-01 00:00:00'),
PARTITION P2 VALUES LESS THAN ('2021-02-01 00:00:00'),
PARTITION P3 VALUES LESS THAN ('2021-03-01 00:00:00'),
PARTITION P4 VALUES LESS THAN (MAXVALUE));
begin
DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'table_o', DBMS_REDEFINITION.CONS_USE_PK);
end;
/
begin
DBMS_REDEFINITION.START_REDEF_TABLE(USER,
'table_o',
'table_n');
end;
/
insert into table_o values(456,'2021-02-03 12:00:00');
commit;
begin
dbms_redefinition.sync_interim_table(USER, 'table_o', 'table_n');
end;
/
begin
DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'table_o', 'table_n');
end;
/