我目前正在尝试在带有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是否有任何区别。我试过了。
答案 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#execute
或PreparedStatement#executeUpdate
:
//the former query is a DDL query
pstmt.execute();
//the latter query is a DML query
pstmt.executeUpdate();