使用包含 rownum 的选择查询更新 ResultSet

问题描述

我正在尝试使用不包含主键的表执行选择查询,因此我在选择查询中包含行号,以便结果集变为可滚动但未更新并给出以下错误>

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。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...