Oracle 1.8 CachedRowSet.populate ошибка, где выберите systimestamp из двойного

У меня простой вопрос... Почему этот код ниже не работает?

  • Версия JDK: 1.8.0_92
  • Версия БД Oracle: 11.2.0.1.0
  • Драйвер JDBC для Oracle: ojdbc6.jar ---> Я не смог найти этот источник кода Java:(

    String SQL = "select systimestamp from dual";
    
    Statement statement = null;
    ResultSet rs = null;
    try {
        statement = getConnection(name).createStatement();
        if (statement != null) {
            rs = statement.executeQuery(SQL);
        }
    
        // Need to use a CachedRowSet that caches its rows in memory, which
        // makes it possible to operate without always being connected to
        // its data source
        CachedRowSet rowset = new CachedRowSetImpl();
        rowset.populate(rs);
        return rowset;
    } catch (SQLException ex) {
        throw new DatabaseException(ex.getMessage(), ex);
    } finally {
        safeCloseResultSet(rs);
        safeCloseStatement(statement);
    }
    

Трассировка стека:

java.sql.SQLException: Invalid SQL type for column
at javax.sql.rowset.RowSetMetaDataImpl.checkColType(RowSetMetaDataImpl.java:114)
at javax.sql.rowset.RowSetMetaDataImpl.setColumnType(RowSetMetaDataImpl.java:459)
at com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:761)
at com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:639)

Строка "rowset.populate(rs);" выдает "java.sql.SQLException: неверный тип SQL для столбца"

Ошибка возникает, когда я пытаюсь выполнить запрос:

select systimestamp from dual

Но если я использую приведенный ниже код вместо "rowset.populate(rs);", это работает:

rs.getTimestamp(1)

И если я попытаюсь выполнить запрос ниже, все работает хорошо:

select sysdate from dual

Итак, как я могу использовать rowset.populate(rs), чтобы получить syscurrenttimestamp?

Я начинаю думать, что это ошибка реализации JDBC оракула...

Извините за мой плохой английский:)

1 ответ

Решение

Как говорит @krokodilko, я опубликую здесь свой комментарий в качестве ответа:

Я решил проблему с помощью паллиативного решения. Вместо того, чтобы выполнить запрос на возврат TIMESTAMP, я сделал это, чтобы вернуть STRING:

SELECT TO_CHAR(SYSTIMESTAMP, 'DD/MM/YYYY HH24:MI:SS.SSXFF TZR') FROM DUAL

А потом мне пришлось сделать разбор в TIMESTAMP. Я знаю, что это некрасиво, но только пока мы не найдем правильное решение. Я все еще надеюсь, что кто-то поможет нам в этом вопросе.

Другие вопросы по тегам