问题描述:
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程序调用未报错,但是过程调试的时候却报错了。