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定义如下,


可疑的地方是id列,类型是short,取值范围是-2的15次方 ~ 2的15次方-1,即-32768 ~ 32767。


问下开发,开发和测试环境max(id)值,

开发环境max(id)=5325

测试环境max(id)=177830


至此,问题就比较明显,测试环境的id值6位,已经超了short类型5位,这就可以解释为何开发环境正常,测试环境运行则会报错,单独运行SQL语句均不会报错。


让开发人员模拟插入一条6位的id记录,运行程序,此时开发环境,出现了之前测试环境的报错,明确此问题。


解决方案就是将short id改为long id,需要业务上明确此值范围,可以接受。


啰嗦一下,MOS中搜索ORA-01426,有以下场景会出现此类错误,

(1)Bug 16621589 - ORA-1426 "numeric overflow" from AUTO_SPACE_ADVISOR_JOB_PROC (文档 ID 16621589.8)

(2) ORA-01426: Numeric Overflow After Downgrade From 11g (文档 ID 1308137.1)

(3) LOGMINER FAILS WITH ORA-01426 (文档 ID 1554518.1)


MOS中搜索java.sql.SQLException,有以下产品会出现错误,

Bug 19019306 : ERROR UPDATING MEDIATOR INSTANCE: JAVA.SQL.SQLEXCEPTION: NUMERIC OVERFLOW





解决方法就是打patch,我猜和字段类型有关,

Oracle SOA Suite

'Java.sql.SQLException: Numeric Overflow' coming from the composite instance after completion (文档 ID 2128017.1)

需要Apply Patch 19019306。


总结:

1. 目前已经知道了问题,反过来看,首先程序报错Numeric Overflow,提示很清楚,就是有数据类型溢出了,但未出现ORA错误号,因此很有可能不是数据库中的问题,进一步使用SQL执行,未出现错误,说明很有可能是代码问题,类型溢出的可能场景,变量定义的类型,被赋予了超过其范围的一个值,检索报错SQL涉及的变量定义,很有可能就会发现问题。

2. 我们可能经常碰见这样的问题,一条SQL,一段code,一个环境可以,另一个环境报错,我觉得首先需要考虑的,就是明确问题的范围,是SQL语句的问题,是代码问题,抽丝剥茧,大胆怀疑,细心验证,真相往往就只有一个!



如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

目录
相关文章
|
1月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
335 5
|
6月前
|
SQL Java 数据库连接
Java中实现SQL分页的方法
无论何种情况,选择适合自己的,理解了背后的工作原理,并能根据实际需求灵活变通的方式才是最重要的。
189 9
|
10月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
413 17
|
10月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
3287 11
|
10月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
1094 6
|
10月前
|
SQL Java 数据库连接
如何用 Java 校验 SQL 语句的合法性?
本文介绍了五种校验 SQL 语句合法性的方案:1) 使用 JDBC API 的 `execute()` 方法,通过捕获异常判断合法性;2) 使用 JSqlParser 库解析 SQL 语句为 Java 对象;3) 使用正则表达式检查 SQL 语句格式;4) 使用 ANTLR 生成 SQL 解析器;5) 使用 Apache Calcite 解析 SQL。每种方法各有优劣,具体选择取决于需求和个人偏好。需要注意的是,这些方法仅能校验语法合法性,无法保证语义正确性,仍需防范 SQL 注入攻击。
435 6
|
10月前
|
Java Windows
【Azure Function】部署Java Function失败:报错deploy [ERROR] Status code 401和警告 'China North 3' may not be a valid region
1:deploy [ERROR] Status code 401, (empty body). 2: China North 3 may not be a valid region,please refer to https://aka.ms/maven_function_configuration#supported-regions for values. 3:  <azure.functions.maven.plugin.version>1.36.0</azure.functions.maven.plugin.version>
177 11
|
11月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
436 9
|
12月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
152 8
|
SQL 分布式计算 Java
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
206 3