4

我整周都在努力解决生产错误。

我终于明白了,我可以找到导致所有混乱的罪魁祸首记录。

我收到以下错误消息:

java.sql.SQLException: [BEA][Oracle JDBC Driver][Oracle]ORA-01438: value larger than specified precision allows for this column

最终从所有信息中我认为这可能是错误的数据,系统正在尝试插入:

10385274000

进入 NUMBER(10)

我怎么知道这个值是否合适?

谢谢

编辑

根据 Michel Todd 的建议:

create table xyz( testfield number( 10 ) );

insert into xyz values( 10385274000 )


Error: ORA-01438: value larger than specified precision allowed for this column

谢谢你们!!!

谢谢stackoverflow

编辑

给自己的笔记(不要忘记问题所在)

我有这个 Oracle 产品,它在数据库表中存储事件的时间

START_TIME|END_TIME

事实证明,它每天晚上都会将此信息备份到另一个表中,但在此过程中会执行一次转换。它确实存储为:

TOTALTIME

当这个字段是通过减去 ENDTIME - STARTTIME 来计算时,问题就来了。结果数字存储在此列中,定义为:NUMBER(10)

好吧,事实证明,如果 END_TIME-START_TIME 在时间(大约 4 个月左右)太远,值(以毫秒为单位)会太大,不适合目标列(我猜它有类似 endTime .getTime() - 代码中的 startTime.getTime()

现在所有这些听起来都太容易太傻了,但我花了 4 天以上的时间才发现,因为这是一个封闭的应用程序,我不知道发生了什么,我唯一得到的就是堆栈跟踪。

我不得不对整个过程进行逆向工程(在这个词的旧意义上,手动并且显然没有源代码)以找出这一点。

当我这样做时,我的“手动编码迁移器”中出现了同样的错误,并找出解决方法!

4

1 回答 1

12

NUMBER(10) 中的数字 10 指定字段大小。这意味着该字段可以包含最多 10 个字符的数字。您的号码有 11 位数字,因此该值太大而无法适应。任何小于 (<) 100 亿 (10 000 000 000) 的东西都可以毫无问题地插入。如果您想在插入之前验证值,这就是您需要检查的内容。

于 2009-08-01T01:15:58.607 回答