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

时间:2008-10-15 16:12:53

标签: sql oracle datetime

这种情况出现在现实生活中,无效数据进入(并继续进入)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'storage conventions,看起来他们能够绕过列的语义限制并插入等效的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列?

2 个答案:

答案 0 :(得分:6)

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

如果您感到异常反常,可以在日期使用未记录的REVERSE功能并使其无效。

答案 1 :(得分:1)

我似乎无法在快速Metalink搜索中找到该错误(如果您尚未使用Oracle打开SR,我建议这样做),但我知道OCI层中存在错误(Oracle调用接口) )允许错误代码插入无效日期。在大多数情况下,这些错误已经纠正了一段时间,所以我倾向于下注,如果您将最新的补丁集应用于正在执行插入的客户端计算机,问题就会消失。