【问题标题】:Oracle 1.8 CachedRowSet.populate error where select systimestamp from dualOracle 1.8 CachedRowSet.populate error where select systimestamp from dual
【发布时间】:2018-02-08 18:45:21
【问题描述】:

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

  • JDK版本:1.8.0_92
  • Oracle 数据库版本: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);”行抛出“java.sql.SQLException: Invalid SQL type for column”

当我尝试执行查询时出现错误:

select systimestamp from dual

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

rs.getTimestamp(1)

如果我尝试执行下面的查询,一切都运行良好:

select sysdate from dual

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

开始以为是oracle的jdbc实现的bug……

对不起我的英语不好:)

【问题讨论】:

  • 我不知道你的问题的答案,对不起。我只想问——如果可以的话——这个值必须有多精确? SYSDATE 最多包含秒; SYSTIMESTAMP 还包括带时区的小数秒。我只是希望 SYSDATE 可能就足够了。
  • 可能是驱动程序中的错误。也许您应该尝试最新版本的驱动程序?查看驱动程序下载页面上的 README 文件:oracle.com/technetwork/database/features/jdbc/…,例如它可能是这个错误:11670695 RESULTSET.GETTIMESTAMP() RETURNS WRONG TIMESTAMP TIMESTAMP WITH LOCAL TIME ZONE Possible wrong timestamp with TIMESTAMPLTZ if db and session timezone are equal.
  • 嗨@Littlefoot!感谢您的关注! SYSDATE 的问题在于时间信息 hh:mm:ss 取决于 Oracle NLS_DATE_FORMAT 的配置方式,就我而言,我无法更改它。无论如何,我有需要毫秒信息的业务规则。
  • 嗨@krokodilko!是的!我用Oracle Database 12c Release 2 (12.2.0.1) drivers升级了JDBC驱动(我认为是最年轻的),但问题依旧。
  • 我最终用姑息性解决方案解决了这个问题。我没有执行返回 TIMESTAMP 的查询,而是让它返回一个 STRING (SELECT TO_CHAR(SYSTIMESTAMP, 'DD/MM/YYYY HH24:MI:SS.SSXFF TZR') FROM DUAL)。然后我必须对 TIMESTAMP 进行解析。我知道这很丑陋,但直到我们找到正确的解决方案。我仍然希望有人能帮助我们解决这个问题。

标签: java oracle jdbc timestamp cachedrowset


【解决方案1】:

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

我最终通过姑息性解决方案解决了这个问题。我没有执行返回 TIMESTAMP 的查询,而是让它返回一个 STRING:

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

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

【讨论】:

    猜你喜欢
    • 2017-10-22
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多