问题描述
嗨,
我正在测试一些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:
您可以看到该表只有一个字段 (时间戳),并且在同一字段上只有一个分区。
在测试的第二步中,我创建了源表TMP_TESTE_MANA_15:
如您所见,此表具有相同数量的字段,但具有函数中的值SYSTIMESTAMP 与CAST()到时间戳。
在最后一步,我试图在这两个表之间做一个简单的交换分区:
当我执行我得到以下错误:
ORA-14097: column type or size mismatch on ALTER TABLE EXCHANGE PARTITION
我看到通过以下查询,这些字段具有相同的数据类型,但是不同的DATA_LENGTH (11和20):
我在Oracle Live SQL (版本18c) 中应用了相同的代码,并且工作当我在这种环境中执行完整的外部查询时,两个DATA_LENGTH都有11个字节,就像下面的CSV导出一样:
为什么在11g版本中CREATE TABLE和CREATE TABLE AS SELECT 与CAST()有不同数量的字节?
这是11g版本的bug吗?毕竟,在18c工作正常。
有人可以解释11g发生了什么吗?
有没有办法在11g上解决这种情况?
谢谢。
我正在测试一些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 TABLE和CREATE TABLE AS SELECT 与CAST()有不同数量的字节?
这是11g版本的bug吗?毕竟,在18c工作正常。
有人可以解释11g发生了什么吗?
有没有办法在11g上解决这种情况?
谢谢。
专家解答
有一个错误与cast (... 作为时间戳)。在11.2x中,当您在create table中使用它时,总是将长度设置为20。
这是固定在12.2。请参阅MOS注释19613048.8。
这是固定在12.2。请参阅MOS注释19613048.8。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
645次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
624次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
523次阅读
2025-04-20 10:07:02
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
520次阅读
2025-04-08 09:12:48
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
479次阅读
2025-04-22 00:20:37
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
457次阅读
2025-04-17 17:02:24
Oracle 19c RAC更换IP实战,运维必看!
szrsu
455次阅读
2025-04-08 23:57:08
一页概览:Oracle GoldenGate
甲骨文云技术
454次阅读
2025-04-30 12:17:56
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
449次阅读
2025-04-22 00:13:51
火焰图--分析复杂SQL执行计划的利器
听见风的声音
400次阅读
2025-04-17 09:30:30