ORA-01426:numeric overflow

問題描述:

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程序調用未報錯,但是過程調試的時候卻報錯了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章