Oracle 1.8 CachedRowSet.populate 错误,其中 select 来自 dual 的系统时间戳
Oracle 1.8 CachedRowSet.populate error where select systimestamp from dual
我有一个简单的问题...为什么下面的代码不起作用?
- 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 实现的一个错误...
抱歉我的英语不好:)
正如@krokodilko 所建议的,我将 post 在这里将我的评论作为答案:
我最终用姑息的方法解决了这个问题。我没有对 return a TIMESTAMP 执行查询,而是对 return a STRING:
SELECT TO_CHAR(SYSTIMESTAMP, 'DD/MM/YYYY HH24:MI:SS.SSXFF TZR') FROM DUAL
然后我不得不对 TIMESTAMP 进行解析。我知道这很丑陋,但直到我们找到正确的解决方案。我仍然希望有人能帮助我们解决这个问题。
我有一个简单的问题...为什么下面的代码不起作用?
- 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 实现的一个错误...
抱歉我的英语不好:)
正如@krokodilko 所建议的,我将 post 在这里将我的评论作为答案:
我最终用姑息的方法解决了这个问题。我没有对 return a TIMESTAMP 执行查询,而是对 return a STRING:
SELECT TO_CHAR(SYSTIMESTAMP, 'DD/MM/YYYY HH24:MI:SS.SSXFF TZR') FROM DUAL
然后我不得不对 TIMESTAMP 进行解析。我知道这很丑陋,但直到我们找到正确的解决方案。我仍然希望有人能帮助我们解决这个问题。