暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 由于强制转换 (时间戳),具有相等字段和不同字节的Exchange分区失败

askTom 2018-10-31
237

问题描述

嗨,

我正在测试一些Exchange分区概念,以改善我创建的过程。

我使用的数据库版本是:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production


为了测试解决方案,我开始创建目标表TMP_TESTE_MANA_14:

CREATE TABLE TMP_TESTE_MANA_14
(
DT_ATUALIZACAO TIMESTAMP NOT NULL
)
PARTITION BY RANGE (DT_ATUALIZACAO)
(
PARTITION P_201810 VALUES LESS THAN (TO_DATE(' 2018-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
);
复制


您可以看到该表只有一个字段 (时间戳),并且在同一字段上只有一个分区。

在测试的第二步中,我创建了源表TMP_TESTE_MANA_15:

CREATE TABLE TMP_TESTE_MANA_15
(
DT_ATUALIZACAO NOT NULL
)
AS
SELECT CAST(SYSTIMESTAMP AS TIMESTAMP) AS DT_ATUALIZACAO
FROM DUAL;
复制


如您所见,此表具有相同数量的字段,但具有函数中的值SYSTIMESTAMP CAST()到时间戳。

在最后一步,我试图在这两个表之间做一个简单的交换分区:

ALTER TABLE TMP_TESTE_MANA_14 EXCHANGE PARTITION P_201810 WITH TABLE TMP_TESTE_MANA_15;
复制


当我执行我得到以下错误:

ORA-14097: column type or size mismatch on ALTER TABLE EXCHANGE PARTITION

我看到通过以下查询,这些字段具有相同的数据类型,但是不同的DATA_LENGTH (11和20):

SELECT A.TABLE_NAME,
B.TABLE_NAME,
A.COLUMN_ID,
B.COLUMN_ID,
A.COLUMN_NAME,
B.COLUMN_NAME,
A.DATA_TYPE,
B.DATA_TYPE,
A.DATA_LENGTH,
B.DATA_LENGTH,
A.DATA_PRECISION,
B.DATA_PRECISION
FROM USER_TAB_COLUMNS A
FULL OUTER JOIN USER_TAB_COLUMNS B
ON (A.COLUMN_NAME = B.COLUMN_NAME)
WHERE A.TABLE_NAME = 'TMP_TESTE_MANA_14'
AND B.TABLE_NAME = 'TMP_TESTE_MANA_15';
复制


TABLE_NAME TMP_TESTE_MANA_14
TABLE_NAME TMP_TESTE_MANA_15
COLUMN_ID 1
COLUMN_ID 1
COLUMN_NAME DT_ATUALIZACAO
COLUMN_NAME DT_ATUALIZACAO
DATA_TYPE TIMESTAMP(6)
DATA_TYPE TIMESTAMP(6)
DATA_LENGTH 11
DATA_LENGTH 20
DATA_PRECISION 
DATA_PRECISION 
复制


我在Oracle Live SQL (版本18c) 中应用了相同的代码,并且工作当我在这种环境中执行完整的外部查询时,两个DATA_LENGTH都有11个字节,就像下面的CSV导出一样:

TABLE_NAME,TABLE_NAME,COLUMN_ID,COLUMN_ID,COLUMN_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE,DATA_LENGTH,DATA_LENGTH,DATA_PRECISION,DATA_PRECISION
TMP_TESTE_MANA_14,TMP_TESTE_MANA_15,1,1,DT_ATUALIZACAO,DT_ATUALIZACAO,TIMESTAMP(6),TIMESTAMP(6),11,11, - , - 
复制


为什么在11g版本中CREATE TABLECREATE TABLE AS SELECTCAST()有不同数量的字节?

这是11g版本的bug吗?毕竟,在18c工作正常。

有人可以解释11g发生了什么吗?

有没有办法在11g上解决这种情况?

谢谢。

专家解答

有一个错误与cast (... 作为时间戳)。在11.2x中,当您在create table中使用它时,总是将长度设置为20。

这是固定在12.2。请参阅MOS注释19613048.8。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论