【问题标题】:How can I use DECLARE clause in a statement on jdbc?如何在 jdbc 的语句中使用 DECLARE 子句?
【发布时间】:2015-04-28 21:03:03
【问题描述】:

我目前正在尝试在带有 jdbc 的preparedStateent 中使用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 秒),具有预定义的时间间隔。间隔是定时器变量。定时器变量通过方法传递。

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

【问题讨论】:

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


    【解决方案1】:

    假设您需要从一个选择中创建一个新表,那么您应该改用这个查询:

    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();
    

    【讨论】:

    • 您不能参数化列 names,只能通过 JDBC 参数化 values
    • @MickMnemonic 在发布答案之前我已经测试了代码。
    • 好的,看来您可以在SELECT 中为INSERT 执行此操作。对此功能的支持可能是特定于供应商的?
    • @MickMnemonic 是的,这取决于数据库供应商。
    • 所以这取决于我的数据库供应商?因为我收到错误语法错误。 @LuiggiMendoza
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多