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 将数字直接插入数据库。我使用 sqlfiddle 并使用 SQLDeveloper 通过我的本地数据库进行了尝试。我也可以在 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 有一列 TEST_VAL 声明为 BINARY_DOUBLE)。

但是,如果您尝试使用客户端-服务器工具(我使用 Allround Automations - v.8.0.4.1514 FWIW 的 PL/SQL Developer 进行测试)来检索这些值以执行 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 回答