1

我想使用可滚动的结果集,所以当我使用两行代码时:

 rs.setFetchDirection(ResultSet.TYPE_SCROLL_SENSITIVE);
rs.absolute(12);

在我的 DAOimpl 中,我得到了异常,请帮助解决它们,在此先感谢。

 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;
                        }
                    });

        }
    }

这是例外

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)

///////////////////////////////////////// //////////////////////////////////

我改变如下,我没有得到任何结果,通常,我的程序返回 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;
            }
        });
4

2 回答 2

6

首先,ResultSet.TYPE_SCROLL_SENSITIVE是一个指示结果集类型的常量,当然不是需要 fecth 方向的setFetchDirection有效参数。引用 javadoc 的参数部分ResultSet#setFetchDirection(int direction)

direction-int指定建议的获取方向;ResultSet.FETCH_FORWARD, ResultSet.FETCH_REVERSE, 或中的一个ResultSet.FETCH_UNKNOWN

因此出现异常和消息“调用中的参数无效:setFetchDirection”。

顺便说一句,根据 Oracle 的“ JDBC Developer's Guide and Reference ”(所有版本都可以从http://tahiti.oracle.com/获得)在Processing a Scrollable Result Set

预设获取方向

JDBC 2.0 标准允许预先指定方向(称为获取方向)以用于处理结果集。这允许 JDBC 驱动程序优化其处理。指定了以下结果集方法:

  • void setFetchDirection(int direction) throws SQLException * int getFetchDirection() throws SQLException

Oracle JDBC 驱动只支持前向预设值,您可以通过输入 ResultSet.FETCH_FORWARD静态常量值来指定。

ResultSet.FETCH_REVERSEResultSet.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().


UPDATE:调用有问题connection.prepareCall(),第三个参数应该是并发类型(要么是要么ResultSet.CONCUR_READ_ONLYResultSet.CONCUR_UPDATABLE。尝试这个:

            return connection.prepareCall(
                    "{call PKG_USER.getUser(?,?)}",
                    ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_UPDATABLE);
于 2010-01-15T03:58:16.090 回答
0

从 jdbc 模板获取自定义结果集。Spring 提供了 PreparedStatementCreatorFactory,您可以从中创建 PreparedStatementCreator。

PreparedStatementCreatorFactory pc = new PreparedStatementCreatorFactory(sqlQuery, , new int[] {Types.VARCHAR});//query and params Types
pc.setResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE);//TYPE_SCROLL_INSENSITIVE 
pc.setUpdatableResults(false);//CONCUR_READ_ONLY

jdbcTemplate.query(pc.newPreparedStatementCreator(listOfParams),
                        myResultSetExtractor);//perform query with custom psc, process results at ResultSetExtractor
于 2021-01-22T13:43:56.647 回答