OraHelper oraConn = new OraHelper();//这是数据库连接
       String procedure = "{ call pkg_fjcj.p_search(?,?,?,?,?) } ";
   CallableStatement cstmt = oraConn.getStatement().getConnection().prepareCall(procedure);
    cstmt.setInt(1,Integer.parseInt(dotid));
    cstmt.setString(2,pot);
    cstmt.setString(3,fromdate);
    cstmt.setString(4,enddate);
    cstmt.registerOutParameter(5,OracleTypes.CURSOR);
     
    cstmt.executeQuery();
    
    ResultSet rs = (ResultSet)cstmt.getObject(5); 我用rs.last等语句时报错:
 java.sql.SQLException: 对只转发结果集的无效操作: last

解决方案 »

  1.   

    TYPE_FORWARD_ONLY是不能调用last()方法的。看说明:
     CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) 
      

  2.   

    public ResultSet shopPotCollection(int dotid,String pot,String fromDate,String endDate){
       
     ResultSet result = null ;
       try{
       
           String procedure = "{ call pkg_fjcj.p_search(?,?,?,?,?) } ";
       CallableStatement cstmt = oraConn.getStatement().getConnection().prepareCall(procedure,java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
          // CallableStatement cstmt = oraConn.p
           cstmt.setInt(1,dotid);
        cstmt.setString(2,pot);
        cstmt.setString(3,fromDate);
        cstmt.setString(4,endDate);
        cstmt.registerOutParameter(5,OracleTypes.CURSOR);
         
        cstmt.executeQuery();
        
        result = (ResultSet)cstmt.getObject(5);
          } 
       catch(Exception e)
          {
       e.getStackTrace();
       System.out.println("shopPotCollection->返回数据集错误!");
          }
       return result;    
       }这样也不中
    其实我已经在下面的函数中加了:
    public Statement getStatement()
    {
    Statement sqlCommand = null ; try
    {
    Class.forName( driverName ) ;
    Connection conn = DriverManager.getConnection(  connString,username,password  ) ;
    //System.out.println("conn="+conn);
    //sqlCommand = conn.createStatement();
    /*
    创建一个只读的、可滚动的数据指针类型
     */
    sqlCommand = conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
    }
    catch( Exception ex )
    {
    ex.getStackTrace();
    // log.error( ex.getMessage() ) ;
    }

    return sqlCommand ;
    }
      

  3.   

    实际上,数据库驱动程序可能无法支持你滚动或更新光标的请求。
    DatabaseMetaData类的supportsResultSetType和supportResultSetConcurrency方法负责告诉你某个数据库究竟支持那些结果集类型合并发性模式。即使数据库支持,某个特定的查询也可能无法产生带有你要求的所有属性的结果集。
    例如:复杂查询的结果集可能不是可更新的结果集。
    你可以使用ResultSet类的getType和getConcurrency方法来查找某个结果集实际上属于何种模式。
      

  4.   

    ResultSet rs = ((OracleCallableStatement)cstmt).getCursor(5);