2016-08-25 2 views
1

Java 6で正しく動作し、Java 8でコンパイルされて実行されるJavaコードで奇妙なエラーが発生すると、SQLException:Invalid column index "Java 8:NUMBER(x、0)の値を持つResultset.getBigDecimalエラー

私のテーブルのSQL値は、タイプがNUMBER(2,0)であり、実際にはそれがうまく理解できれば整数値です。

コードは次のとおりです。

BigDecimal idPointHoraire = oResultset.getBigDecimal("ID_POINT_HORAIRE"); 

値が実際の整数であるように、ここで私は、コードを修正する方法である:

BigDecimal idPointHoraire = new BigDecimal(oResultset.getInt("ID_POINT_HORAIRE")); 

質問は次のとおりです。

  1. なぜこれをJava 6で正しく動作していたJava 8の動作
  2. 「列インデックスが無効です」という例外は、列を名前で取得すると、なぜですか?
+1

オラクルの「NUMBER」タイプは、[documentation](https://docs.oracle.com/cd/B19306_01/java.102/b14188/datamap.htm)に従ってJavaの「BigDecimal」にマップされます。 –

+0

APIまたはJDBCドライバが過去数年間に変更された可能性があります。 'ID_POINT_HORAIRE'カラムをintとして扱うことは、私が見たものに基づいて正しくないように見えるかもしれませんが、以前のバージョンではそれを取り除いていた可能性があります。 –

+0

JREはインタフェースのみを提供するため、JREの更新は特定のJDBCドライバの実際のResultSet実装の動作に影響を与えません。特定のドライバベンダーがAPIをどのように解釈するかを学ぶことは、Java 6より前であっても常に楽しいものでした。 – Holger

答えて

0

"NUMBER(2,0)"は直感的には整数ですが、これも10進数のデータ型です。小数点を過ぎた場所の数を単に0に制限しただけです。したがって、この動作が変更された場合は、まあ、修正された可能性があります。

実際にデータベース列を整数にする場合は...まあ、INTEGERのOracle型にしてください。

BigDecimalはNUMBERデータ型をマップするもので、ドライバで実装されている可能性があります。あなたは、あなたのoracleドライバをダウングレードして、それが何か変わるかどうかを調べることができます。

関連する問題