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