使用包含行数的select查询更新ResultSet



我试图执行select查询表不包含主键,因此我在选择查询中包括行数,使结果集成为可滚动的,但它不更新,并给出下面的错误

Java代码:

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test
{
public static void main(String[] args) throws Exception
{
Connection con = Provider.getOracleConnection();
String sql = "select rownum, users.* from users";
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = st.executeQuery(sql);
rs.absolute(1);
rs.updateString(3, "Bibek Bhusan");
rs.updateRow();
}
}

错误:

Exception in thread "main" java.sql.SQLException: ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc.
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1169)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3368)
at oracle.jdbc.driver.UpdatableResultSet.executeUpdateRow(UpdatableResultSet.java:2690)
at oracle.jdbc.driver.UpdatableResultSet.updateRow(UpdatableResultSet.java:1835)
at Test.main(Test.java:15)

只需删除rownum列,它应该工作。Rownum不标识特定的行。它只是行在特定查询结果中的位置。重新执行相同的查询可以以不同的顺序返回行,在这种情况下,行将具有不同的rownums。