什么是在oracle中看起来相同的两列不一样?

时间:2009-04-10 02:25:55

标签: java oracle jdbc toplink

我在oracle 9i的一个项目上工作。我在使用toplink 10.1.3加载表中的特定行时遇到问题。事实证明,toplink所依赖的jdbc驱动程序非常有趣。也许这里有人可以提供帮助...

我有一个名为:crazytable的表。它有一列:“ver_num number(19)not null default 0”。几年前,该列作为原始插入的一部分添加到表中。当我从crazytable中选择任何记录(参见下面的jdbc连接代码)并尝试执行rs.getLong(colIndex)时,一切正常。但是,如果我执行rs.getObject(colIndex),我会得到一个stacktrace:

java.lang.ArrayIndexOutOfBoundsException: 1
    at oracle.sql.NUMBER.toBigDecimal(NUMBER.java:651)
    at oracle.jdbc.dbaccess.DBConversion.NumberBytesToBigDecimal(DBConversion.java:2805)
    at oracle.jdbc.driver.OracleStatement.getBigDecimalValue(OracleStatement.java:4539)
    at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5666)
    at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5622)
    at oracle.jdbc.driver.OracleResultSetImpl.getObject(OracleResultSetImpl.java:739)
    at oracle.jdbc.driver.OracleResultSet.getObject(OracleResultSet.java:1470)
    stacktrace truncated to protect my poor code...

我可以使用另一个表,让我们调用它:sanetable,并对具有相同名称和类型“ver_num number(19)not null default 0”的列运行相同的查询。而rs.getLong(colIndex)和rs.getObject(colIndex)工作得很好。

任何一列都不涉及约束或索引。我已经尝试过oracle驱动程序9.2.0.8,9.2.0.5,9.2.0.1,甚至10. *(这都行不通)。

有谁知道我能在这做什么?

这是我的基本连接代码。成功调用之间的唯一区别是所讨论的特定表:

            Class.forName(oracle.jdbc.OracleDriver.class.getName());
    String url = "jdbc:oracle:thin:@IPADDRESS:PORT:INSTANCE";
        Connection conn = null;
        ResultSet rs = null;
        try {
            conn = DriverManager.getConnection(url, "user","pass");
            PreparedStatement prepareStatement = conn.prepareStatement(
                    "select distinct ver_num " +

                    "FROM [crazytable|sanetable] " 
                    );
            rs = prepareStatement.executeQuery();
            assertNotNull(rs);
            while (rs.next()) {
                ResultSetMetaData md = rs.getMetaData();
                for (int i = 1; i <= md.getColumnCount(); i++) {
                    String key = md.getColumnLabel(i);
                    Object value = rs.getLong(key);
                    System.out.println(key+" : "+value 
                            +" was null: "+rs.wasNull()
                            +" type: "+ rs.getType()
                            +" class: "+ md.getColumnClassName(i));
                }
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (conn != null) {
                conn.close();
            }
        }

编辑:可以在此页面上找到该驱动程序:http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

1 个答案:

答案 0 :(得分:0)

好吧,我想我想出来了。我正在查看其他一些问题并注意到还有其他oracle 4型驱动程序。其中之一是DataDirect(http://datadirect.com)。我使用了他们的驱动程序的试用版,它能够返回rs.getObject(intIndex)。

该值为:-1.6777120E-27。

所以rs.getLong()向下舍入为零,但BigDecimal看到一个小数部分并抛出异常。

也许这是因为oracle的驱动程序是用jdbc1.4 vs编译的,对于datadirect来说是更新的。