Numeric Overflow,SQL问题?Java Code问题?

简介: 这两天出差,出发前开发同学提了一个问题,开会间隙,有了一些想法,java代码中和Oracle中均有可能出现此错误,记录于此。一段mybatis的代码,查询一张表的数据,SQL类似如下,接受起始时间和截止时间,作为检索条件。

这两天出差,出发前开发同学提了一个问题,开会间隙,有了一些想法,java代码中和Oracle中均有可能出现此错误,记录于此。


一段mybatis的代码,查询一张表的数据,SQL类似如下,


接受起始时间和截止时间,作为检索条件。


现象:

1. 开发库运行这段代码,正常返回,测试库运行这段代码,无记录返回的情况正常,只要有记录返回,无论有几条,均会报错,Numeric Overflow,注意这儿报的是java.sql.SQLException,并未有任何ORA code,


2. 单独运行SQL语句,开发库和测试库不会报错。


实际ORA有这个类似的Numeric Overflow报错,ORA-01426,


这是一个reduce the operands示例,

http://www.cnblogs.com/fangwenyu/archive/2010/06/11/1756643.html


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


上限超了2,147,483,647,则报错了ORA-01426,



上限未超2,147,483,647,



下限超了-2,147,483,648,则报错了ORA-01426,



下限未超-2,147,483,648,



补充一下,PLS_INTEGER和BINARY_INTEGER数据类型的区别,官方文档如下描述的,



根据“http://blog.csdn.net/chen7788/article/details/8620438“的描述,这两种类型的区别和优点包括,

binary_integer与pls_integer都是整型类型。

binary_integer:类型变量值计算是由Oracle来执行,不会出现溢出,但是执行速度较慢,因为它是由oracle模拟执行。

pls_integer:可以存储一个有符号的整形值,其精度范围和binary_integer一样,是:-2^31~2^31。它的执行是由硬件即直接由CPU来运算,因而会出现溢出,但其执行速度较binary_integer快许多。

pls_integer和number比较起来,其优点是:

1). 占有较少的存储空间;

2). 可以直接进行算术运算(在number上不能直接进行算术运算,如果要计算,number必须先被转换成二进制)。所以在进行算术的时候pls_integer比number和binary_integer快一些。


有些扯远了,以上是Oracle中出现ORA-01426的错误信息。回到开始mybatis报错的场景下,从报错的service层一直往下挖,entity定义如下,