首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

ORA-01455 錯誤深度解析:數值轉換溢位 Integer 型別的根因與對策

     編輯:Oracle 資料庫相關知識

同事回報應用執行特定查詢時拋出 ORA-01455: converting column overflows integer datatype,其他條件卻正常。經排查發現,根因在於資料庫欄位定義與應用程式變數型別不匹配。本文詳細記錄排查過程、MOS 文獻參考與解決方案。

一、錯誤現象與初步判斷

  • 僅特定過濾條件觸發錯誤,推測對應資料列有異常值。
  • MOS 文件 1087122.1 指出:序列初始值超過 10 位數、C 程式固定長度限制、顯示長度限制等可能導致此錯誤。

二、深入排查鎖定問題資料

  1. 確認問題欄位定義為 NUMBER(10)。
  2. 該筆資料實際值為 8 開頭的 10 位數字(如 8,000,000,000),超過 Java Integer 最大值 2,147,483,647(2^31-1)。
  3. 應用程式使用 getInt() 讀取,導致轉換溢位拋出 ORA-01455。

三、解決方案

方案一:修正應用程式讀取型別(推薦)

將 getInt() 改為 getLong() 或 getDouble(),對應資料庫 NUMBER(10) 範圍。

// 錯誤寫法
int val = rs.getInt("COL_NAME");

// 正確寫法
long val = rs.getLong("COL_NAME");
// 或
double val = rs.getDouble("COL_NAME");

方案二:資料庫端限制資料範圍(輔助)

  • 加入 CHECK (COL_NAME <= 2147483647) 約束,防止寫入超大值。
  • 或調整欄位精度為 NUMBER(9),但需評估業務影響。

四、核心原理總結

ORA-01455 本質是「欄位值超出目標變數型別可表示範圍」的轉換錯誤。

  • 資料庫 NUMBER(p,s) 精度遠大於程式語言基本型別(int、short 等)。
  • 開發時必須建立「資料庫欄位精度 ↔ 程式變數型別」對照表,確保映射正確。
  • 常見對照:NUMBER(10) → Long/BigDecimal;NUMBER(19) → BigDecimal。

五、延伸排查清單

  1. 檢查所有 NUMBER 欄位對應的 Java 型別是否足夠容納最大值。
  2. 啟用資料庫稽核或應用日誌,記錄實際讀取值與目標型別上限。
  3. 單元測試覆蓋邊界值(Integer.MAX_VALUE、Long.MAX_VALUE)。

六、參考資源

  • MOS Doc ID 1087122.1:序列初始值超過 10 位導致 ORA-01455
  • Oracle JDBC Developer's Guide:ResultSet 型別對照表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved