同事回報應用執行特定查詢時拋出 ORA-01455: converting column overflows integer datatype,其他條件卻正常。經排查發現,根因在於資料庫欄位定義與應用程式變數型別不匹配。本文詳細記錄排查過程、MOS 文獻參考與解決方案。
1087122.1 指出:序列初始值超過 10 位數、C 程式固定長度限制、顯示長度限制等可能導致此錯誤。NUMBER(10)。Integer 最大值 2,147,483,647(2^31-1)。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。NUMBER 欄位對應的 Java 型別是否足夠容納最大值。Integer.MAX_VALUE、Long.MAX_VALUE)。1087122.1:序列初始值超過 10 位導致 ORA-01455ResultSet 型別對照表