只读结果集的操作无效:updateString

时间:2013-09-19 05:35:25

标签: java sql oracle jdbc

以下是我的代码(重新构建),其中选择&根据条件更新STATUS字段。 (使用Servlet,Oracle作为后端和JDBC驱动程序)

ResultSet rs=null;
String query = "select A.NAME, A.ADDRESS, A.STATUS, B.CLASS from TABLE_ONE A, TABLE_TWO B where A.STATUS='N'";
pstmt = con.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = pstmt.executeQuery();
while(rs.next())
{
    String name = rs.getString("NAME");
    String address = rs.getString("ADDRESS");
    String class = rs.getString("CLASS");

    String msg = //Other statements to check what status to be set

    if(msg.equals("OK"))
        rs.updateString("STATUS", "S");
    else
        rs.updateString("STATUS", "E");
    rs.updateRow();
}

我在更新时收到错误:

java.sql.SQLException: Invalid operation for read only resultset: updateString

任何建议都将受到赞赏。

更新1: 当select语句从单个表中选择数据时,相同的代码正在工作,所以在单个查询中从两个表中选择数据时是否有任何问题?

[注意:正如@javaBeginner在评论中提到的,它只适用于一个表。]

2 个答案:

答案 0 :(得分:2)

对增强结果集的查询存在以下限制。不遵循这些准则将导致JDBC驱动程序选择替代结果集类型或并发类型。

生成可更新的结果集(来自规范):

  • 查询只能从一个表中进行选择,并且不能包含任何连接操作。

此外,为了使插入可行,查询必须选择所有不可为空的列和所有没有默认值的列。 *查询不能使用" SELECT *"。 (但请参阅下面的解决方法。) *查询必须仅选择表列。它不能选择派生列或聚合,例如一组列的SUM或MAX。

生成滚动敏感的结果集:

  • 查询无法使用" SELECT *"。 (但请参阅下面的解决方法。)
  • 查询只能从一个表中进行选择。

答案 1 :(得分:0)

试试这个:

 Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

//Execute a query
 String sql = "select A.NAME, A.ADDRESS, A.STATUS, B.CLASS from TABLE_ONE A, TABLE_TWO B where A.STATUS='N'";
 ResultSet rs = stmt.executeQuery(sql);
//Extract data from result set
  rs.beforeFirst();
while(rs.next())
{
    String name = rs.getString("NAME");
    String address = rs.getString("ADDRESS");
    String class = rs.getString("CLASS");

    String msg = //Other statements to check what status to be set

    if(msg.equals("OK"))
        rs.updateString("STATUS", "S");
    else
        rs.updateString("STATUS", "E");
    rs.updateRow();
}

刚刚更改了Prepared语句以创建语句