相关文章推荐
年轻有为的橡皮擦  ·  ORA-01426:numeric ...·  1 月前    · 
年轻有为的橡皮擦  ·  SQL predicates ...·  8 月前    · 
傻傻的大熊猫  ·  ERROR 2002 (HY000): ...·  1小时前    · 
正直的豆芽  ·  [MY-010273] [Server] ...·  1小时前    · 
刀枪不入的小蝌蚪  ·  jQuery has() 方法 | ·  2 小时前    · 
重感情的番茄  ·  try to re connect to ...·  3 小时前    · 
留胡子的香菜  ·  C# for/foreach 循环 | ·  3 小时前    · 

问题描述:

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

问题描述:1.使用ibatis框架调用存储过程,此存储过程的业务是根据起始值和结束值用循环批量新增数据。此时起始值和结束值输入了一个13位数:1000000000001,1000000000010,这时工程应该生成以1000000000001开头,以1000000000010结尾的数据,但是java层调用以后,却生成了异常数据,表现为负数。问题分析与调试:1.首先排查是不是过程的问题,...
Ora cle的Exp命令导出数据出现:EXP-00008: 遇到 ORA CLE 错误 604; ORA -00604: 递归 SQL 级别 1 出现错误; ORA - 01426 : 数字溢出
Non-resolvable parent POM Failure to find was cached in the local repository ‘parent.relativePath‘ hoho_12: 2023-1-13,又遇到了同样的问题,settings.xml配置不一样,导致不能打包。 Could not find artifact com.test:test_warnMsg:pom:2.0.0-RC in nexus-releases (http://IP:PORT/content jxls 报 omitted for conflict with 3.0.0-beta1 idea编译问题导致接口调用不通
 
推荐文章