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

How can I use DECLARE clause in a statement on jdbc?

我目前正尝试在 jdbc 的 preparedStatement 中使用 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 ;");

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

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

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

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";

假设您已经创建了 table 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();