执行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总是给人惊喜,但其实还是自己学艺不精,忽略了这些细节。