Oracle 1.8 CachedRowSet.populate错误选择systimestamp来自dual

时间:2018-02-08 18:45:22

标签: java oracle jdbc timestamp cachedrowset

我有一个简单的问题......为什么下面的代码不起作用?

  • JDK版本:1.8.0_92
  • Oracle DB版本:11.2.0.1.0
  • Oracle JDBC驱动程序: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); ”行抛出“j ava.sql.SQLException:列的SQL类型无效”

尝试执行查询时发生错误:

select systimestamp from dual

但是,如果我使用下面的代码而不是“ rowset.populate(rs); ”,它可以工作:

rs.getTimestamp(1)

如果我尝试执行下面的查询,一切效果很好:

select sysdate from dual

那么,如何使用 rowset.populate(rs)来获取 syscurrenttimestamp

我开始认为这是oracle的jdbc实现的错误......

抱歉我的英文不好:)

1 个答案:

答案 0 :(得分:0)

正如@krokodilko建议的那样,我将在此发表我的评论作为答案:

我最终用姑息解决方案来解决问题。我没有执行查询来返回TIMESTAMP,而是返回STRING:

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

然后我不得不对TIMESTAMP进行解析。我知道这很难看,但直到找到正确的解决方案。我仍然希望有人能帮助我们解决这个问题。