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