【发布时间】:2009-08-01 01:07:53
【问题描述】:
我整周都在努力解决生产错误。
我终于明白了,我可以找到导致所有混乱的罪魁祸首记录。
我收到以下错误消息:
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 天以上的时间才发现,因为这是一个封闭的应用程序,我不知道发生了什么,我唯一知道的是堆栈跟踪。
我不得不对整个过程进行逆向工程(在这个词的旧意义上,手动并且显然没有源)以找出这一点。
当我这样做时,我的“手动编码迁移器”中出现了同样的错误,并了解如何解决它!
【问题讨论】:
-
如果您确实使用了“紧急”一词,请以可读的格式使用它,而不是持续使用的词。紧急就紧急,但人们必须知道紧急,这很难:“紧急!”
-
一种 q&d 方法是创建一个包含数字 (10) 的临时表并尝试插入该值。如果它有效,那不是问题。
标签: java oracle jdbc types maxlength