如何在jdbc上的语句中使用DECLARE子句?

时间:2015-04-28 21:03:03

标签: java mysql jdbc prepared-statement sql-insert

我目前正在尝试在带有jdbc的preparedStatent中使用DECLARE子句。我写的代码是:

         statement.executeUpdate(" declare @variable int set @variable = "+timer+" INSERT INTO table1 values (ip, protocol, counter, timer) SELECT ip,protocol,counter,@variable FROM table2 ORDER BY counter DESC LIMIT 5 OFFSET 0 ;");

我想要的是创建一个新表(即table1),其中包含table2的前5个(例如每5秒),具有预定义的间隔。间隔是计时器变量。 timer变量通过一个方法传递。

注意:我不知道使用preparedStatement是否有任何区别。我试过了。

1 个答案:

答案 0 :(得分:1)

假设您需要从select创建一个新表,那么您应该使用此查询:

CREATE TABLE table1 SELECT ip,protocol,counter,@variable FROM table2 ORDER BY counter DESC LIMIT 5 OFFSET 0

但是如果你在Java中使用PreparedStatement执行此操作,那么可以将@variable的值作为参数传递,从而摆脱先前的查询。因此,您的查询在Java代码中将如下所示:

String sql =
    "CREATE TABLE table1"
    + " SELECT ip,protocol,counter,?"
    + " FROM table2"
    + " ORDER BY counter DESC"
    + " LIMIT 5 OFFSET 0";

假设您已经创建了表table1并且只是从table2添加了最新结果,那么查询将如下所示:

INSERT INTO table1 values (ip, protocol, counter, timer) SELECT ip,protocol,counter,@variable FROM table2 ORDER BY counter DESC LIMIT 5 OFFSET 0

同样,您可以将@variable的值作为参数传递。查询在Java代码中将如下所示:

String sql = 
    "INSERT INTO table1 (ip, protocol, counter, timer)"
    + " SELECT ip,protocol,counter,?"
    + " FROM table2"
    + " ORDER BY counter DESC"
    + " LIMIT 5 OFFSET 0";

然后,您将准备如下的查询:

PreparedStatement pstmt = con.prepareStatement(sql);
//setting your variable as the parameter in the query
pstmt.setString(1, timer);

最后,您将使用PreparedStatement#executePreparedStatement#executeUpdate

//the former query is a DDL query
pstmt.execute();
//the latter query is a DML query
pstmt.executeUpdate();