代码之家  ›  专栏  ›  技术社区  ›  Nathan Feger

Oracle中看起来相同的两列何时不相同?

  •  0
  • Nathan Feger  · 技术社区  · 15 年前

    我在Oracle9i中的一个项目中工作。我在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 回复  |  直到 15 年前
        1
  •  0
  •   Nathan Feger    15 年前

    好吧,我想我明白了。我查看了其他一些问题,发现还有其他Oracle4类型的驱动程序。其中一个是datadirect( http://datadirect.com )我使用了他们的驱动程序的试用版,它能够返回rs.getobject(intindex)。

    数值为-1.6777120E-27。

    所以rs.getlong()被四舍五入为零,但是bigdecimal看到了一个小数部分,并抛出了一个异常。

    这可能是由于Oracle的驱动程序是用JDBC1.4vs编译的,这是DataDirect的更新版本。

    推荐文章