我怎么知道10385274000是否符合:Oracle的NUMBER(10)?

时间:2009-08-01 01:07:53

标签: java oracle jdbc types maxlength

我整个星期都在工作,以解决生产错误。

我最终得到的结果是我能找到导致所有混乱的罪魁祸首。

我收到以下错误消息:

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意义上,用手,显然是从源头开始)找到这个。

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

1 个答案:

答案 0 :(得分:11)

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