rs.last()为仅向前结果集提供无效操作:last

时间:2012-01-25 17:19:24

标签: java oracle jdbc resultset

我试图通过以下方式获取结果集的行数:

rs.last();
int row_count = rs.getRow();

但是我遇到了Invalid operation for forward only resultset : last错误。结果集从Oracle 10g数据库获取数据。

以下是我设置连接的方式:

    Class.forName("oracle.jdbc.driver.OracleDriver");
    String connectionString = "jdbc:oracle:thin:@" + oracle_ip_address + ":" + oracle_db_port + ":" + oracle_db_sid;
    Connection conn = DriverManager.getConnection(connectionString, oracle_db_username, oracle_db_password);

3 个答案:

答案 0 :(得分:28)

ResultSet.last()和其他“绝对索引”查询操作仅在结果集可滚动时可用;否则,您只能通过仅向前结果集逐个迭代。

以下示例(来自the javadocs)演示了如何创建可滚动的ResultSet

Statement stmt = con.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY
);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");

请记住,使用可滚动查询会对性能产生影响。如果此特定ResultSet的目标只是获取其最后一个值,请考虑优化您的查询以仅返回该结果。

答案 1 :(得分:5)

PreparedStatement ps = conn.prepareStatement ("SELECT * FROM
         EMPLOYEE_TABLE WHERE LASTNAME = ?" ,
         ResultSet.TYPE_SCROLL_INSENSITIVE , 
         ResultSet.CONCUR_UPDATABLE ,
         ResultSet.HOLD_CURSOR_OVER_COMMIT) ;

对于预准备语句,您必须至少指定类型last()isLast()的并发模式。

答案 2 :(得分:0)

感谢cheeken(上面的2篇文章),但在Java 1.8中,createStatement()函数现在需要2个参数

示例:

stmt 
  = conx.createStatement
      (ResultSet.TYPE_SCROLL_INSENSITIVE
      ,ResultSet.CONCUR_READ_ONLY
      );