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 在什么条件下(连接机制等)允许无效数据进入日期时间列?

4

2 回答 2

6

Oracle 通常不允许这样做。OCI 层可以绕过数据类型验证——Oracle 基本上相信您在这七个字节中输入的内容构成了有效日期。同样,在 OCI 层,Oracle 可以传回 7 个字节的“日期”,由客户端软件对这些字节执行任何操作(保持原样,转换为字符串或纪元... ) 也许更好的方法是找出在那里加载数据的内容,然后看看这些日期在做什么。

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

于 2008-11-18T04:29:34.240 回答
1

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

于 2008-10-15T16:26:41.547 回答