1

スクロール可能な結果セットを使用したいので、2行のコードを使用する場合:

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

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

        }
    }

これは例外です

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を示す定数であり、正確な方向を期待する有効な引数ではありません。の javadoc のパラメータ セクションを引用します。setFetchDirectionResultSet#setFetchDirection(int direction)

direction-int推奨されるフェッチ方向の指定; 、ResultSet.FETCH_FORWARDResultSet.FETCH_REVERSEまたはのいずれかResultSet.FETCH_UNKNOWN

したがって、例外とメッセージ「Invalid argument(s) in call: 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 Release 2 JDBC Drivers (これを書いている時点での最終バージョン)のreadmeにも記載されています。

スクロール可能な結果セットの実装には、次の制限があります。

  • ScrollableResultSet の setFetchDirection() は何もしません。

しかし、これはすべてsetFetchDiretion、スクロール可能な結果セットを取得する方法ではありません。

Spring の でスクロール可能な結果セットを作成するには、カスタム実装JdbcTemplateでメソッドを実際に使用する必要があります。この実装では、メソッドを使用して、指定された型と同時実行性を持つオブジェクトを生成するを作成します。最後に、 を呼び出します。execute(CallableStatementCreator csc, CallableStatementCallback action)CallableStatementCreatorConnection.prepareCall(String sql, int resultSetType, int resultSetConcurrency)CallableStatementResultSetrs.absolute()


更新:呼び出しに問題がありconnection.prepareCall()ます。3 番目のパラメーターは同時実行型 ( または のいずれ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 に答える