我整个星期都在工作,以解决生产错误。
我最终得到的结果是我能找到导致所有混乱的罪魁祸首。
我收到以下错误消息:
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天才发现,因为这是一个封闭的应用程序我不知道发生了什么,我唯一得到的是堆栈跟踪。
我不得不对整个过程进行逆向工程(在OLD意义上,用手,显然是从源头开始)找到这个。
当我这样做时,我的“手动编码迁移器”中出现了同样的错误,并找出解决方法!
答案 0 :(得分:11)
NUMBER(10)中的数字10指定字段大小。这意味着该字段可以容纳最多10个字符的数字。您的号码有11位数字,因此值很大。任何小于(<)100亿(10 000 000 000)的东西都可以毫无问题地插入。如果要在插入之前验证值,则需要检查这些内容。