问题描述
我正在尝试使用不包含主键的表执行选择查询,因此我在选择查询中包含行号,以便结果集变为可滚动但未更新并给出以下错误>
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 不标识特定行。它只是该特定查询结果中行的位置。重新执行相同的查询可以以不同的顺序返回行,在这种情况下,行将具有不同的 rownum。