ORA-01426:numeric overflow

问题描述:

1.使用ibatis框架调用存储过程,此存储过程的业务是根据起始值和结束值用循环批量新增数据。此时起始值和结束值输入了一个13位数:1000000000001,1000000000010,这时工程应该生成以1000000000001开头,以1000000000010结尾的数据,但是java层调用以后,却生成了异常数据,表现为负数。

问题分析与调试:

1.首先排查是不是过程的问题,把入参带入plsql中调试,过程直接就报错了。过程报:ORA-01426:numeric overflow,数字溢出。但是这个字段数据库长度是number(15),应该不会超过长度啊。网上查了下,原来for循环对长度有限制。

在FOR循环中可能会遇到ORA-01426,主要是由于起始值或者结束值超过了2147483647,默认情况下
FOR 循环的数值需要 在-2147483648 到 2147483647之间,否则就会报错。

除此之外,数据类型溢出的实验如下,例如PLS_INTEGER数据类型的值范围:-2的31次方 ~ 2的31次方-1,即-2,147,483,648 ~ 2,147,483,647

参考文章:

http://blog.chinaunix.net/uid-22948773-id-3047969.html

https://blog.csdn.net/bisal/article/details/74783947

但是点击系统功能时,却能保存成功,很奇怪。这一点一直想不通。

于是排查代码发现,从ibatis层的入参给的是Integer类型,最大值为2,147,483,647,最小值为-2,147,483,648,也就是2的31次方。

当输入的值超过这个长度时,会发生异常。

于是把入参的类型改为Long,问题解决。

  • long数据类型是64位、有符号的以二进制补码表示的整数;占8字节
  • 最小值是-9,223,372,036,854,775,808(-2^63);
  • 最大值是9,223,372,036,854,775,807(2^63 -1);

解决此问题的关键在于:Java程序调用未报错,但是过程调试的时候却报错了。

 

 

上一篇:oracle汇编01


下一篇:Mybatis—typeHandlers默认支持的类型处理器