m0z*_*4rt 1 java oracle resultset spring-jdbc scrollableresults
我想使用可滚动的结果集,所以当我使用两行代码时:
rs.setFetchDirection(ResultSet.TYPE_SCROLL_SENSITIVE);
rs.absolute(12);
Run Code Online (Sandbox Code Playgroud)
在我的DAOimpl中,我得到例外,plz帮助解决它们,谢谢提前.
import oracle.jdbc.OracleTypes;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Component;
@Component
public class MyDAOimpl extends JdbcDaoSupport implements
MyDAO {
public List<User> getList(final String where) throws Exception {
return (List) getJdbcTemplate().execute(
"{call PKG_USER.getUser(?,?)}",
new CallableStatementCallback() {
public Object doInCallableStatement(CallableStatement cs)
throws SQLException {
cs.setString(1, where);
cs.registerOutParameter(2, OracleTypes.CURSOR);
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(6);
rs.setFetchDirection(ResultSet.TYPE_SCROLL_SENSITIVE);
rs.absolute(12);
List<User> list = new ArrayList<User>();
while (rs.next()) {
User user = new User(
rs.getString(1),
rs.getString(2),
rs.getString(3));
list.add(user);
}
return list;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是例外
java.sql.SQLException: Invalid argument(s) in call: setFetchDirection
oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
oracle.jdbc.driver.BaseResultSet.setFetchDirection(BaseResultSet.java:128)
Run Code Online (Sandbox Code Playgroud)
////////////////////////////////////////////////// ////////////////////////////////////////
我改变如下,我没有得到任何结果,通常,我的程序返回100个用户:
return (List) getJdbcTemplate().execute(new CallableStatementCreator() {
public CallableStatement createCallableStatement(
Connection connection) throws SQLException {
return connection.prepareCall(
"{call PKG_USER.getUser(?,?)}",
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.TYPE_SCROLL_INSENSITIVE);
}
}, new CallableStatementCallback() {
public Object doInCallableStatement(CallableStatement cs)
throws SQLException, DataAccessException {
cs.setString(1, where);
cs.registerOutParameter(2, OracleTypes.CURSOR);
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(6);
//////not run////
rs.absolute(12);
////////////////
List<User> list = new ArrayList<User>();
while (rs.next())
{
List<User> list = new ArrayList<User>();
while (rs.next()) {
User user = new User(
rs.getString(1),
rs.getString(2),
rs.getString(3));
list.add(user);
}
return list;
}
});
Run Code Online (Sandbox Code Playgroud)
首先,ResultSet.TYPE_SCROLL_SENSITIVE是一个表示结果集类型的常量,当然不是一个setFetchDirection需要fecth方向的有效参数.引用javadoc的参数部分ResultSet#setFetchDirection(int direction):
direction-int指定建议的获取方向; 中的一个ResultSet.FETCH_FORWARD,ResultSet.FETCH_REVERSE或ResultSet.FETCH_UNKNOWN
因此异常和消息"调用中的无效参数:setFetchDirection".
根据Oracle的" JDBC开发人员指南和参考 "(所有版本均可从http://tahiti.oracle.com/获取)处理可滚动结果集的 BTW :
预设获取方向
JDBC 2.0标准允许预先指定方向,称为获取方向,以用于处理结果集.这允许JDBC驱动程序优化其处理.指定了以下结果集方法:
void setFetchDirection(int direction) throws SQLException*int getFetchDirection() throws SQLExceptionOracle JDBC驱动程序仅支持前向预设值,您可以通过输入
ResultSet.FETCH_FORWARD静态常量值来指定该 值.值
ResultSet.FETCH_REVERSE和ResultSet.FETCH_UNKNOWN不支持.尝试指定它们会导致SQL警告,并忽略设置.
在Oracle Database 11g第2版JDBC驱动程序的自述文件中(在编写本文时的最终版本)中也提到了这一点:
可滚动结果集实现具有以下限制:
- ScrollableResultSet上的setFetchDirection()不执行任何操作.
但所有这些都是一种旁注,使用 setFetchDiretion它根本不是获得可滚动结果集的方法.
要使用Spring创建可滚动的结果集JdbcTemplate,您应该将该方法execute(CallableStatementCreator csc, CallableStatementCallback action)与自定义CallableStatementCreator实现一起使用.在此实现中,使用该方法Connection.prepareCall(String sql, int resultSetType, int resultSetConcurrency)创建CallableStatement将生成ResultSet具有给定类型和并发性的对象.最后,打电话rs.absolute().
更新:有一个在一个问题connection.prepareCall()呼叫,第三个参数应该是一个并发类型(ResultSet.CONCUR_READ_ONLY或ResultSet.CONCUR_UPDATABLE).试试这个:
return connection.prepareCall(
"{call PKG_USER.getUser(?,?)}",
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9320 次 |
| 最近记录: |