我有一个如下表结构:
PROD(PROD_ID NUMBER,PROD_NAME VARCHAR2(100), MATCH_SCORE NUMBER)
基于某些计算(后端逻辑不属于我们的应用程序),有时Infinity会存储在MATCH_SCORE
中。
问题是为什么它允许在NUMBER
列(MATCH_SCORE
)中使用Infinity。
我自己试图让Infinity进入专栏:
INSERT INTO PROD VALUES(1,"PEN",1.0F/0); -- Doesn't work
INSERT INTO PROD VALUES(1,"PEN",BINARY_DOUBLE_INFINITY); -- Doesn't work.
以下数字可以存储在NUMBER列中:
正数,范围为1 x 10-130至9.99 ... 9 x 10125,最多38位有效数字
负数从-1 x 10-130到9.99 ... 99 x 10125,最多38位有效数字
零
正负无穷(仅通过从Oracle数据库导入,第5版生成)
(我的重点)
我们不是从版本5迁移的,它仍然发生在Oracle 11中。
Java MCVE说明问题是如何产生的:
SQL:
CREATE TABLE test_infinity ( value NUMBER );
爪哇:
try {
Class.forName( "oracle.jdbc.OracleDriver" );
Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl",
"username",
"password"
);
PreparedStatement st = con.prepareCall( "INSERT INTO test_infinity VALUES ( :value )" );
((OraclePreparedStatement)st).setNUMBERAtName( "value", NUMBER.posInf() );
st.execute();
st.close();
con.close();
}
catch ( ClassNotFoundException | SQLException ex ){}