0

我正在从事 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),我会得到一个堆栈跟踪:

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

4

1 回答 1

0

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

该值为:-1.6777120E-27。

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

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

于 2009-04-10T04:58:43.847 回答