【发布时间】:2018-03-20 07:44:46
【问题描述】:
挣扎于一些执行存储过程调用的java / sql代码,然后是select,然后是insert into -
对存储过程的调用起作用并创建了“持续时间”表——
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);
}
但是错误'Operation not allowed after ResultSet closed'暗示var4被关闭了?
我显然在做一些愚蠢的事情,也许插入应该在选择之前,所以希望得到一些关于解决这个问题的“正确方法”的指导。
问候 活跃
【问题讨论】:
-
当您有参数时,请始终使用
PreparedStatement。 Take a look -
为什么插入只发生一次而不是每一行?插入可能需要在选择之前,但我不确定语法是否正确。
-
仅供参考:您应该为变量命名比
var#更有用的名称