Когда две колонки, которые выглядят одинаково, не совпадают в оракуле? - PullRequest
0 голосов
/ 10 апреля 2009

Я работаю над проектом в Oracle 9i. У меня была проблема с загрузкой toplink 10.1.3 определенной строки в таблице. Оказывается, драйвер jdbc, на который опирается toplink, действует очень забавно. Возможно, кто-то здесь может помочь ...

У меня есть таблица с именем: crazytable. У него есть столбец: «номер ver_num (19) не ноль по умолчанию 0» Этот столбец был добавлен в таблицу как часть оригинальной вставки несколько лет назад. Когда я выбираю любую запись (см. Ниже для кода подключения jdbc) из crazytable и пытаюсь сделать 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) работают очень хорошо.

Ни один столбец не участвует в ограничении или индексе. Я пробовал драйвер оракула 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();
            }
        }

edit: Драйвер можно найти на этой странице: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

1 Ответ

0 голосов
/ 10 апреля 2009

Хорошо, я думаю, что понял это. Я просматривал некоторые другие вопросы и заметил, что есть другие драйверы оракула типа 4. Одним из них является DataDirect (http://datadirect.com). Я использовал пробную версию их драйвера, и он смог вернуть rs.getObject (intIndex).

Значение было: -1.6777120E-27.

Итак, rs.getLong () округлялся до нуля, но BigDecimal видел десятичную часть и выдавал исключение.

Возможно, это связано с тем, что драйвер oracle компилируется с использованием jdbc1.4, что является более новым для datadirect.

...