当前位置:  开发笔记 > 编程语言 > 正文

Oracle数据库允许在什么情况下无效的datetime列值时间部分?

如何解决《Oracle数据库允许在什么情况下无效的datetime列值时间部分?》经验,为你挑选了1个好方法。

这种情况出现在现实情况中,其中无效数据存在(并继续进入)Oracle数据库,该数据库被提取到Focus中的数据处理系统中.聚焦会因某些行无效时间而窒息死亡.然后Oracle DBA会从一个好的列中将日期时间复制到受影响的列中,以允许该过程继续(是的,我知道).

我协助解决了问题并发现在受影响的行上的Oracle中:

DUMP(START_TIME)

得到:

'Typ=12 Len=7: 100,99,255,255,0,0,0'

而:

TO_CHAR(START_TIME, 'YYYY/MM/DD HH24:MI:SS')

得到:

ORA-01801: date format is too long for internal buffer

查看DUMP()结果'Typ=12 Len=7: 100,99,255,255,0,0,0'和存储约定,看起来它们能够绕过列的语义限制并插入等效的0,-1,-1,-1,-1,-1,-1或0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

这是"有意义的",因为0xFF = 255 = -1可能会导致0000/255/255 255:255:255取决于您如何解释字节,符号和溢出.

在什么条件下(连接机制等)Oracle是否允许无效数据进入datetime列?



1> Gary Myers..:

Oracle通常不允许这样做.OCI层可以绕过数据类型验证 - Oracle基本上相信你在这7个字节中放入的内容构成了一个有效的日期.类似地,在OCI层,Oracle可以传回7个字节的"日期",由客户端软件根据需要对这些字节做任何事情(保留原样,转换为字符串或纪元号... )也许更好的方法是找出加载数据的内容,看看日期是做什么的.

如果您感觉异常不正常,您可以在日期使用未记录的REVERSE函数并使其无效.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有