You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

声明result.concur_update后调用deleteRow()报错?附Java JDBC代码

解决ResultSet.deleteRow()报错的问题

嘿,我来帮你搞定这个问题!你遇到的报错说明虽然创建Statement时指定了CONCUR_UPDATABLE,但实际得到的ResultSet并没有真的具备可更新能力,这在Oracle JDBC场景下通常是几个常见原因导致的:

可能的原因及解决方案

1. Oracle JDBC驱动要求查询语句必须明确指定列名(避免使用SELECT *)

Oracle的JDBC驱动对可更新ResultSet有严格要求:不能用SELECT *查询,必须明确列出需要操作的列名,而且查询的表必须包含主键(这是驱动识别可更新行的关键依据)。

把你的查询语句修改成类似这样(假设employees表的主键是emp_id):

String query="SELECT emp_id, emp_name FROM employees";

2. 验证ResultSet的实际并发模式

可以在创建ResultSet后加一行代码,确认它的并发模式是否真的是可更新的:

ResultSet rs=st.executeQuery(query);
// 新增这行验证代码
System.out.println("ResultSet并发模式:" + rs.getConcurrency());
if(rs.getConcurrency() == ResultSet.CONCUR_UPDATABLE){
    System.out.println("ResultSet是可更新的");
}else{
    System.out.println("ResultSet不可更新");
}

如果输出显示不可更新,那说明驱动没有满足你的创建参数要求,大概率是查询语句或表结构的问题。

3. 检查Oracle JDBC驱动版本

如果你使用的是较老的驱动版本(比如ojdbc6或更早),可能存在可更新ResultSet的兼容性bug。建议升级到对应Oracle版本的最新驱动:

  • Oracle 12c+ 对应 ojdbc8
  • Oracle 11g 对应 ojdbc7

修改后的完整代码示例

public static void main(String args[]) throws ClassNotFoundException,SQLException { 
    String driver="oracle.jdbc.OracleDriver"; 
    String url="jdbc:oracle:thin:@localhost:1521:XE"; 
    String user="system"; 
    String pass="sysdb"; 
    Class.forName(driver); 
    Connection con=DriverManager.getConnection(url,user,pass); 
    Statement st=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
    // 明确指定列名,假设主键是emp_id
    String query="SELECT emp_id, emp_name FROM employees"; 
    ResultSet rs=st.executeQuery(query); 

    // 验证ResultSet是否可更新
    System.out.println("ResultSet并发模式:" + rs.getConcurrency());
    if(rs.getConcurrency() == ResultSet.CONCUR_UPDATABLE){
        System.out.println("ResultSet是可更新的");
    }

    System.out.println("S.No\tid\tname"); 
    while(rs.next()) { 
        System.out.print(rs.getRow()+"\t"); 
        System.out.print(rs.getString(1)+"\t"); 
        System.out.println(rs.getString("emp_name")); 
    } 
    rs.absolute(3); 
    rs.deleteRow(); 

    // 关闭资源(建议加上,避免内存泄漏)
    rs.close();
    st.close();
    con.close();
}

另外提个小建议:尽量不要用system用户操作业务表,建议创建专门的业务用户来操作employees表,这是数据库规范的最佳实践哦~

内容的提问来源于stack exchange,提问作者prabhu r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:47:22