1

Hibernate アプリを Oracle 11g で実行しようとしていますが、double.max_value を永続化しようとすると、次のエラーが発生し続けます。

Caused by: java.sql.SQLException: Internal Error: Overflow Exception trying to bind 1.7976931348623157E308
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
at oracle.jdbc.driver.DoubleBinder.bind(OraclePreparedStatement.java:15676)
at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2948)
at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2202)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3382)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3468)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2437)
... 11 more

この値を保持できない理由を誰か知っていますか?

この問題は Oracle でのみ発生します。Postgres と H2 は正常に動作します。

Oracle データ型を Number および Binary_Double に強制しようとしましたが、結果は同じでした。Hibernate 3 と Oracle 11g を、oracle jdbc ドライバーと OracleSpatial10g ダイアレクトと共に使用しています。

(私は Hibernate と Oracle の初心者なので、助けていただければ幸いです。)

編集:これまでのところ、いくつかの役立つコメントがありますが、まだ問題がわかりません。詳細は次のとおりです。

  • BINARY_DOUBLE を使用して、数値を DB に直接挿入できることがわかりました。SQLDeveloperを使用して、sqlfiddleとローカルデータベースで試しました。SQLDeveloper で取得することもできます。
  • 私の問題は、番号をデータベースにコミットできないことです...何かがデータベースに入る前に例外がスローされます。
4

4 に答える 4

2

@Tomasの回答binary_doubleで述べたように、最大​​値が必要な値で あるデータ型があります。

1.7976931348623157E308数値としてテーブルに挿入する方法は次のとおりです

create table t1 (big_val binary_double);
insert into t1 values( cast('1.7976931348623157E308' as binary_double) );
于 2012-10-30T21:24:17.810 に答える
0

実際、これを Oracle の文字列として保存できます。私はそれをテストしましたが、動作します。Java の場合:

Double d = Double.MAX_VALUE;
PreparedStatement pstmt;
// ...
// INSERT INTO x VALUES(?)

pstmt.setString(1, d.toString());


// SELECT BIG_DOUBLE_COL from x

    String str = rs.getString(1);
    Double nd = str==null?null:new Double(str);

データベースで: テーブル x (BIG_DOUBLE_COL BINARY_DOUBLE) を作成します。

他のデータベースは、Double.MAX_VALUE の文字列表現を有効な Double として受け入れない (つまり、解析できない) ように見えるため、すべてのデータベースで機能するとは限らないことに注意してください。ただし、これらのデータベースは通常、Double.MAX_VALUE で setDouble メソッドを使用することを受け入れます。これは、たとえば Ingres の場合です。

于 2013-04-11T13:02:32.817 に答える
0

@ABCade は、値を文字列から BINARY_DOUBLE にキャストするか、キャストを明示的に実行することによって値を挿入できることは正しいです。

INSERT INTO TEST_TABLE(TEST_VAL)
  VALUES (CAST ('1.7976931348623157E308' AS BINARY_DOUBLE))

または暗黙的に:

INSERT INTO TEST_TABLE(TEST_VAL)
  VALUES ('1.7976931348623157E308')

(TEST_TABLE に、BINARY_DOUBLE として宣言された列 TEST_VAL があると仮定します)。

ただし、クライアント/サーバー ツール (Allround Automations の PL/SQL Developer を使用してテストしました - v.8.0.4.1514 FWIW) を使用してこれらの値を取得しようとすると、次のような SELECT を実行します。

SELECT * FROM TEST_TABLE

次のエラーが表示されます。

ORA-03115: unsupported network datatype or representation

これを回避するには、VARCHAR2 へのキャストが必要です。

共有してお楽しみください。

于 2012-10-31T12:08:17.750 に答える
0

これによると、あなたの値は大きすぎます。BINARY_DOUBLE

于 2012-10-30T19:02:59.077 に答える