分区交换列类型或大小不匹配(ORA-14097) [英] Partition exchange column type or size mismatch (ORA-14097)

查看:18
本文介绍了分区交换列类型或大小不匹配(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆