最近使用PreparedStatement编写代码,遇到ORA-00604:递归SQL级别1出现错误,ORA-01000:超出打开游标的最大数异常,起初修改了pstat.executeUpdate();之后关闭pstat.close();但是依旧报错。后来把conn.prepareStatement(sql);移出for循环即可。
public String insertOperation(List<Map<String, Object>> list) throws Exception {
Connection conn = null;
//数据库连接
if (conn == null || conn.isClosed()) {
conn = DataSourcePool.getConnection();
}
String sql = "INSERT INTO a(id, name, age) VALUES(?, ?, ?)";
String sql2 = "INSERT INTO b(id, classId, className) VALUES(?, ?, ?)";
PreparedStatement pstat = conn.prepareStatement(sql);
PreparedStatement pstat2 = conn.prepareStatement(sql2);
List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();
Map<String,Object> result = new HashMap<String,Object>();
try {
if (list != null && list.size() >0) {
for (int i = 0; i < list.size(); i++) {
result = new HashMap<String, Object>();
result.put("id", list.get(i).get("id"));
result.put("result", "true");
result.put("message", "成功");
conn.setAutoCommit(false);
pstat.setString(1, list.get(i).get("id").toString());
pstat.setString(2, list.get(i).get("name").toString());
pstat.setInt(3, Integer.parseInt(list.get(i).get("age").toString()));
pstat.executeUpdate();
pstat2.setString(1, list.get(i).get("id").toString());
pstat2.setString(2, list.get(i).get("classId").toString());
pstat2.setString(3, list.get(i).get("className").toString());
pstat2.executeUpdate();
conn.commit();
conn.setAutoCommit(true);
resultList.add(result);
}
} else {
result.put("result", "false");
result.put("message", "数据为空");
resultList.add(result);
return JSONArray.fromObject(resultList).toString();
}
} catch (Exception e) {
result.put("result", "false");
result.put("message", "操作失败:" + e.getMessage());
resultList.add(result);
conn.rollback();
} finally {
if (pstat != null) {
pstat.close();
}
if (pstat2 != null) {
pstat2.close();
}
if (conn != null) {
conn.close();
}
}
return JSONArray.fromObject(resultList).toString();
}
执行的SQL其实很多,以2个为例。