使用一些执行存储过程调用的java / sql代码,然后执行select后跟插入 -
对存储过程的调用有效并创建'duration'表 -
while(true) {
boolean var1 = false;
Connection var2 = DBConnPool.getInstance().getConnection();
Statement var3 = null;
ResultSet var4 = null;
try {
var3 = var2.createStatement();
String var5;
var5 = "CALL totalduration('%', NOW() - INTERVAL 20 MINUTE, NOW());";
var3.executeQuery(var5);
然后运行select语句并正确输出多行 -
var5 = "SELECT duration.name, zone, duration, asset.id as assetid, node.id as nodeid\n" +
"FROM duration\n" +
"inner join asset\n" +
"on asset.name = duration.name\n" +
"inner join node\n" +
"on node.zonename = duration.zone\n" +
"where Duration > '00:10:00'\n" +
"and Zone = 'Reception'\n" +
"group by duration.name DESC";
var4 = var3.executeQuery(var5);
然后,我想从结果ResultSet中插入表数据,如果我使用以下内容,那么它只插入1行
If (var4.next())
{
int var6 = var4.getInt("assetid");
int var7 = var4.getInt("nodeid");
String var8;
var8 = "insert into alerts (ts, assetid, alerttypeid, nodeid, ack) values (now(), " + var6 + ", " + 11 + ", " + var7 + ", 0)";
var3.executeUpdate(var8);
}
因此,我假设以下内容将插入应用于所有ResultSet行 -
while(var4.next())
{
int var6 = var4.getInt("assetid");
int var7 = var4.getInt("nodeid");
String var8;
var8 = "insert into alerts (ts, assetid, alerttypeid, nodeid, ack) values (now(), " + var6 + ", " + 11 + ", " + var7 + ", 0)";
var3.executeUpdate(var8);
}
但错误'ResultSet关闭后不允许操作'意味着var4已关闭?
我显然做了一些愚蠢的事情,也许插入应该在选择之前,所以会欣赏一些关于解决这个问题的“正确方法”的指导。
此致 活性
答案 0 :(得分:1)
当生成它的Statement对象关闭,重新执行,或者用于从多个结果序列中检索下一个结果时,ResultSet对象会自动关闭。
您正在使用Statement var3
在循环中执行更新查询。由于这与用于恢复Statement
的{{1}}相同,因此该实例将在下一个ResultSet var4
关闭。这就是为什么你能够读取第一行,执行更新然后发生错误的原因。
您需要使用其他execute#
实例才能使Statement
保持打开状态。实际上,ResultSet
绑定到ResultSet
。
注意:
Statement
不是变量的好名称,var#
,stmt
,...是一些更适合的名称,并且很容易理解每个实例没有搜索的内容宣言。
请注意,完成后,您还应该关闭rs
,Statement
,...(即使出现异常情况)。在这里,我将在以下示例中添加ResultSet
使用PreparedStament而不是连接try-with-resource
,这将更具可读性,如果值为String
,这将更安全(针对SQL注入)
示例(从说明中有一些改进):
String