分区交换列类型或大小不匹配(ORA-14097) [英] Partition exchange column type or size mismatch (ORA-14097)
本文介绍了分区交换列类型或大小不匹配(ORA-14097)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试对数据库执行交换分区,但遇到以下错误:ORA-14097:ALTER TABLE EXCHANGE PARTITION中的列类型或大小不匹配
执行此操作的脚本已创建,并且正在Oracle 11g数据库上按预期运行。一旦我更新到12C,我就遇到了这个问题。我是这样做分区交换的:
-- The new partitioned table.
CREATE TABLE NEW_TABLE
(
id NUMBER(18) NOT NULL,
message VARCHAR2(4000) NOT NULL,
details VARCHAR2(4000),
partition_time TIMESTAMP(6) DEFAULT to_timestamp('01-01-2016','dd-mm-yyyy HH24:MI') NULL
) NOCOMPRESS LOGGING
PARTITION BY RANGE (partition_time) INTERVAL (NUMTODSINTERVAL(1,'HOUR'))
(PARTITION initial VALUES LESS THAN (to_timestamp('01-01-2016','dd-mm- yyyy HH24:MI')));
-- The old table.
CREATE TABLE OLD_TABLE
(
id NUMBER(18,0) NOT NULL,
message VARCHAR2(4000 byte) NOT NULL,
details VARCHAR2(4000),
);
-- Add the column that does not exist on the old table (keep the same columns).
ALTER TABLE OLD_TABLE ADD partition_time TIMESTAMP(6) DEFAULT to_timestamp('01-01-2016','dd-mm-yyyy HH24:MI') NULL;
ALTER TABLE NEW_TABLE
EXCHANGE PARTITION INITIAL
WITH TABLE OLD_TABLE
WITHOUT VALIDATION;
(...)
现在,在Oracle 11g上,这又一次完美地运行。在Oracle12c上,我已经解释了上面的错误。我做了一些研究,我看到人们谈论隐形柱子。好的,我已经重新创建了old_table,所以我认为不会有不可见的列。
编辑:
我已经意识到,在Oracle12c上,当我尝试更改表以创建新列时,会创建另一个不可见列(名为sys_NC00011$)。这就是分区交换不起作用的原因。我现在的问题是,为什么会发生这种情况?"删除这篇专栏"的最佳方式是什么?已尝试删除未使用的列,但未成功。
谢谢你们!
推荐答案
另一个不影响任何内容的可重置解决方案是使用";..for exchange..";子句创建/重建OLD_TABLE(非分区)。它仅在Oracle版本12.2及以上版本中可用。
CREATE TABLE OLD_TABLE **FOR EXCHANGE** WITH TABLE NEW_TABLE;
您的描述不清楚old_table是空的还是在您的情况下有数据。如果您有数据,可以使用
在其中填充数据INSERT INTO OLD_TABLE SELECT * FROM <old backup table>;
这避免了ORA-14097(或在某些情况下为ORA-00932)在‘交换分区’期间无缝完成作业。 在引入与DEFAULT列属性相关的DDL优化后,Oracle可以很快检测到";Exchange分区的问题,因此从12.2开始为Exchange..&q;版本的CTAS操作引入了&q;..。
这篇关于分区交换列类型或大小不匹配(ORA-14097)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文