Oracle(および他のいくつかのDB)にはデータ型NUMBERがあり、オプションで精度と位取りを設定できます。グループ化関数によるJDBC数値型の精度の低下を処理する方法
は、以下のクエリを仮定します
SELECT agent_code,
AVG (opening_amt)
FROM customer
GROUP BY agent_code;
上記のクエリでは両方のフィールドは、NUMBER(12,0)として定義されている場合、JDBCの結果はそれがAGENT_CODEのために実際にあるが、「AVG(opening_amt)」に精度と位取りの両方が0を返します(java.sql.ResultSetMetaData.getPrecision(col)とjava.sql.ResultSetMetaData.getScale(col)を使用)。
これは基本的にNUMBERと同じですが、精度や位取りの指定はありません。 oracleには、NUMBER(38,12)と等しくなります。
上記の精度の低下は、SQL型をDoubleまたはIntegerに変換する必要があるかどうかを判断する上で問題になります。
これは実際にOracleのJDBCドライバのバグか、これをどう処理すべきかと思いました。 (いいえ、対応するJava型としてBigDecimalを使用することは私の選択肢ではありません)。私はあなたが任意のタイプ
CAST(AVG(opening_amt) AS DECIMAL(12,2))
にキャストすることができると思う
元の値が 'NUMBER(12,0)'として定義されている可能性があるため、その平均値が同じ型である必要はありません。実際には、最高の精度で平均を取る必要がある場合、それはかなり悪いことになります。平均を特定のタイプにキャストすることができます。 – Kayaman
合意。しかし、JDBCはフィールドの最大精度とスケールを返すべきではありません(Oracleは内部的にそれを扱います)。 –
私はそう思います。 'ResultSetMetaData.getColumnType()'を介して)実際に 'Types.NUMERIC'列の型ですか? – Kayaman