【发布时间】: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