问题描述
嗨,汤姆,
我们正在将oracle表转换为分区表。为此,我们使用ORACLE Exchange partition。
数据库版本12C。
我们正在遵循的步骤。
1.原始表 -- 现有表
2.当前没有日期字段,因此添加日期列并使用默认SYSDATE填充
3.创建类似于原始表的临时表
4.使用exchange分区从原始表链接数据
这是失败的,有以下错误
ORA-14097: ALTER TABLE EXCHANGE分区中的列类型或大小不匹配
而当我在user_tab_columns中查看列时它是匹配的。但是当我查看sys.col $时,它显示的是与SYS_NC00003 $ 不同的行。
这种方法在11g下工作正常,只在12C下出现问题。
您能否建议如何克服这个问题。
谢谢。
我们正在将oracle表转换为分区表。为此,我们使用ORACLE Exchange partition。
数据库版本12C。
我们正在遵循的步骤。
1.原始表 -- 现有表
create table tab1(col1 integer,
col2 varchar2(100));2.当前没有日期字段,因此添加日期列并使用默认SYSDATE填充
alter table tab1 add col3 date default sysdate; select col#,segcol#,name from sys.col$ where obj#=(select object_id from dba_objects where object_name='TAB1') 1 1 COL1 2 2 COL2 0 3 SYS_NC00003$ 3 4 COL3
3.创建类似于原始表的临时表
create table tab2
partition by range(col3)
interval(numtodsinterval(1,'DAY'))
(
partition PART_01 values less than (TO_DATE('01/09/2018', 'DD/MM/YYYY'))) ENABLE ROW MOVEMENT
as select * from tab1 where 1= 2;4.使用exchange分区从原始表链接数据
ALTER TABLE tab2 EXCHANGE PARTITION PART_01 WITH TABLE tab1 WITHOUT VALIDATION ;
这是失败的,有以下错误
ORA-14097: ALTER TABLE EXCHANGE分区中的列类型或大小不匹配
而当我在user_tab_columns中查看列时它是匹配的。但是当我查看sys.col $时,它显示的是与SYS_NC00003 $ 不同的行。
这种方法在11g下工作正常,只在12C下出现问题。
您能否建议如何克服这个问题。
谢谢。
专家解答
首先,无需查询sys.col $。使用 * _tab_cols!
无论如何,问题是由于12c中的快速列默认添加了可空列。这将创建不可见的SYS _ * 列。还有其他一些功能可能导致系统生成的隐藏列。设置一个未使用的列是关键的罪魁祸首。
那该怎么办?
这在错误17741995中得到解决。如果安装补丁17741995 (包含在12.1.0.2中),则可以通过设置事件14529来解决此问题:
请参阅MOS注释2240439.1。
如果您使用12.2,则还有另一种可能性: 使用 “for exchange was” 参数创建表。然后更改要分区的新表:
无论如何,问题是由于12c中的快速列默认添加了可空列。这将创建不可见的SYS _ * 列。还有其他一些功能可能导致系统生成的隐藏列。设置一个未使用的列是关键的罪魁祸首。
那该怎么办?
这在错误17741995中得到解决。如果安装补丁17741995 (包含在12.1.0.2中),则可以通过设置事件14529来解决此问题:
create table tab1(
col1 integer,
col2 varchar2(100)
);
alter table tab1 add col3 date default sysdate;
select column_name, hidden_column
from user_tab_cols
where table_name = 'TAB1';
COLUMN_NAME HIDDEN_COLUMN
COL3 NO
SYS_NC00003$ YES
COL2 NO
COL1 NO
Alter session set events '14529 trace name context forever, level 512';
create table tab2
partition by range(col3)
interval(numtodsinterval(1,'DAY')) (
partition PART_01 values less than (to_date('01/09/2018', 'DD/MM/YYYY'))
) enable row movement
as
select * from tab1 where 1 = 2;
alter session set events '14529 trace name context off';
alter table tab2
exchange partition part_01 with table tab1 without validation ;
Table TAB2 altered.请参阅MOS注释2240439.1。
如果您使用12.2,则还有另一种可能性: 使用 “for exchange was” 参数创建表。然后更改要分区的新表:
drop table tab2 cascade constraints purge;
create table tab2 for exchange with table tab1;
alter table tab2 modify partition by range(col3)
interval(numtodsinterval(1,'DAY')) (
partition PART_01 values less than (to_date('01/09/2018', 'DD/MM/YYYY'))
);
alter table tab2
exchange partition part_01 with table tab1 without validation ;
Table TAB2 altered. 「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




