Arithmetic overflow or other arithmetic exception occurred. SQL Code: -802, SQL State: 22003


执行DB2更新语句:

update table set column1=361755*10000 where name= 'xxx'; 

时,报数据溢出错误:

Arithmetic overflow or other arithmetic exception occurred. SQL Code: -802, SQL State: 22003

经查询,table表中的column1字段定义为Decimal(24,6),按照常识是可以执行成功的,但是DB2却报溢出错误。

改变写法:

1、update table set column1=361755 where name= 'xxx'; 

     update table set column1=column1*10000 where name= 'xxx';

2、update table set column1=361755*bigint(10000) where name='xxx';

3、update table set column1=float(361755)*10000 where name='xxx';

以上方法均执行成功。

为什么DB2会报这种错误?如果是刚接触DB2或者是没学过DB2的基本理论,或者是从Oracle等其他数据库直接转移到DB2数据库的人来说(我就是从Oracle直接转到DB2的,很少看DB2的理论知识,因为DB2太高深了),这种错误不可思议,因为字段定义的是Decimal,是不应该发生溢出的。但是,如果看过DB2的基本类型后,应该就会有所了解:

DB2数字类型:

1. SMALLINT          ---短整型,范围为-32768~+32767,一遍用的较少

2. INT/INTEGER    ---整型,4个字节,范围为-2147483648~+2147483647,一遍多用于做自动生成的序列,或者用作表记录的id使用。

3. BIGINT               ----大整型,8个字节,精度为19位,够大了,一般较少使用。

4. DECIMAL(P,S)  ---小数型,其中P为精度,S为小数位数,隐含小数点(小数点不计入位数)。

所以,对于改变写法后的第1中写法,用column1=column1*10000,肯定不会报溢出错误,因为column1字段本身就是Decimal类型的。

对于第2、第3中写法,由于是将数据转换为了Decimal或bigint类型,所以也不会溢出。

而如果直接set column1=361755*10000,编译工具会将两个数字默认为int类型,结果也会超过int范围,所以报错。

DB2总是给人惊喜,但其实还是自己学艺不精,忽略了这些细节。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM