IBM Support

[Db2] INTEGER 列に実数値を挿入すると小数点以下が切り捨てられる

Question & Answer


Question

Oracle 互換 DB 上に定義された表の INT 列に実数の値を挿入すると、小数点以下が切り捨てられます。四捨五入されるようにする方法はありますか。

Cause

実数値 (データ型が REAL や DOUBLE など) を Oracle 互換 DB 上に定義された表の INT 列に挿入すると小数点以下が切り捨てられるのは、現在の Db2 の想定される挙動です。

Answer

実数型 (REAL / DOUBLE) ではなく、10 進型 (DECIMAL / DECFLOAT など) のデータ型を使用して挿入してください。
この場合、小数点以下は切り捨てられずに、データベース構成パラメーター DECFLT_ROUNDING の設定にしたがって型変換されます。

以下の実行例は DECFLT_ROUNDING が ROUND_HALF_EVEN (デフォルト値) のケースです。

対応前 (ホスト変数を実数型でバインドしたとき - JDBC の例) :
PreparedStatement pstmt = con.prepareStatement("insert into 表 values(?)");
pstmt.setDouble(1, 199.9999999999);
pstmt.executeUpdate();
結果
$ db2 "select * from 表"

C1
-----------
        199
対応例1 (ホスト変数を 10 進型でバインドする - JDBC の例) :
PreparedStatement pstmt = con.prepareStatement("insert into 表 values(?)");
pstmt.setBigDecimal(1, new BigDecimal(199.9999999999));
pstmt.executeUpdate();
対応例2 (INSERT ステートメント中で 10 進型にキャストする) :
PreparedStatement pstmt = con.prepareStatement("insert into 表 values(CAST(? AS DECFLOAT))");
pstmt.setDouble(1, 199.9999999999);
pstmt.executeUpdate();
結果
$ db2 "select * from 表"

C1
-----------
        200

運用上の考慮点
  • JDBC アプリケーションで setBigDecimal() を使用して 10 進型で変数をバインドした場合、対象表に対して明示的または暗黙的に DESCRIBE が実行されて挿入対象列が INT 型であることがドライバーに伝わると、ドライバーのレベルで型変換が発生し、値を INT 型に変換してからサーバー上の表に挿入しようとします。この型変換では小数点以下が切り捨てられるため、DECFLT_ROUNDING の設定が有効になりません。
  • sendDataAsIs プロパティーを true (省略時値は false) に設定することでドライバーによる型変換を行なわず、アプリケーションからリクエストされたデータ型にしたがってサーバーに値を送信します。

関連情報
NUMBER データ・タイプ
decflt_rounding - 10 進浮動小数点丸め構成パラメーター
Java アプリケーションでデータベース・データ・タイプにマップするデータ・タイプ
サポートされるすべてのデータベース製品に共通の IBM Data Server Driver for JDBC and SQLJ のプロパティー
 

お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m0z0000001gNyAAI","label":"Runtime"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
30 August 2023

UID

swg21698883