声明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
相关产品推荐
相关产品推荐

