Select之后插入(Java sql)

时间:2017-10-09 07:15:50

标签: java mysql

使用一些执行存储过程调用的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已关闭?

我显然做了一些愚蠢的事情,也许插入应该在选择之前,所以会欣赏一些关于解决这个问题的“正确方法”的指导。

此致 活性

1 个答案:

答案 0 :(得分:1)

JavaDoc from ResultSet :

  

当生成它的Statement对象关闭,重新执行,或者用于从多个结果序列中检索下一个结果时,ResultSet对象会自动关闭。

您正在使用Statement var3在循环中执行更新查询。由于这与用于恢复Statement的{​​{1}}相同,因此该实例将在下一个ResultSet var4关闭。这就是为什么你能够读取第一行,执行更新然后发生错误的原因。

您需要使用其他execute#实例才能使Statement保持打开状态。实际上,ResultSet绑定到ResultSet

注意:

  1. Statement不是变量的好名称,var#stmt,...是一些更适合的名称,并且很容易理解每​​个实例没有搜索的内容宣言。

  2. 请注意,完成后,您还应该关闭rsStatement,...(即使出现异常情况)。在这里,我将在以下示例中添加ResultSet

  3. 使用PreparedStament而不是连接try-with-resource,这将更具可读性,如果值为String,这将更安全(针对SQL注入)

  4. 示例(从说明中有一些改进):

    String