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

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

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

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

    我有一张名为crazytable的表。它有一列:“ver_num number(19)not null默认值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,colIndex)运行良好。

    有人知道我在这里能做什么吗?

                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 回复  |  直到 16 年前
        1
  •  0
  •   Nathan Feger    16 年前

    http://datadirect.com ).我使用了他们驱动程序的试用版,它能够返回rs.getObject(intIndex)。

    因此rs.getLong()四舍五入为零,但BigDecimal看到小数部分并抛出异常。

    也许这是由于oracle的驱动程序是用jdbc1.4vs编译的,jdbc1.4vs是datadirect的更新版本。