繁体   English   中英

使用问题? 从 Java 更新时 MySQL 存储过程的通配符

[英]Problems using the ? wildcard for a MySQL stored procedure when updating from Java

我有以下 Java 类,它接受 11 个参数并使用它们在数据库中创建新记录。 存储过程已经过测试并且可以在 MySQL 中运行,但是我无法让访问它的 Java 类正常工作:

public void insert_saved_pub_set(int user_id, String presProfile, String procProfile, String dateLabel, String doc_id, String pubName, String lastLoaded, String publicV, String label, String description, String out_id)
                throws SQLException {                   

    String sql = "call insert_saved_pub_set(?,?,?,?,?,?,?,?,?,?,?);";

    PreparedStatement stmt = conn.prepareStatement(sql);

    stmt.setInt(1, user_id);        
    stmt.setInt(2, Integer.parseInt(presProfile));
    stmt.setInt(3, Integer.parseInt(procProfile));
    stmt.setString(4, dateLabel);
    stmt.setInt(5, Integer.parseInt(doc_id));
    stmt.setString(6, pubName);
    stmt.setInt(7, Integer.parseInt(lastLoaded));
    stmt.setInt(8, Integer.parseInt(publicV));
    stmt.setString(9, label);
    stmt.setString(10, description);
    stmt.setInt(11, Integer.parseInt(out_id));

    stmt.executeUpdate(sql);

}

我尝试测试时遇到的错误是:

您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,在第 1 行的“?,?,?,?,?,?,?,?,?,?,?)”附近使用正确的语法

我已经使用硬编码值测试了 Java 中准备好的语句并且它可以工作,但是我用通配符做了一些愚蠢的事情并且我盯着它看得太久了。

** 在下方添加了修复后评论 **

只是为了关闭它,固定代码如下所示:

public void insert_saved_pub_set(int user_id, String presProfile, String procProfile, String dateLabel, String doc_id, String pubName, String lastLoaded, String publicV, String label, String description, String out_id)
            throws SQLException {               

        String sql = "call insert_saved_pub_set(?,?,?,?,?,?,?,?,?,?,?);";       

        CallableStatement cStmt = conn.prepareCall(sql);        

        cStmt.setInt(1, user_id);       
        cStmt.setInt(2, Integer.parseInt(presProfile));
        cStmt.setInt(3, Integer.parseInt(procProfile));
        cStmt.setString(4, dateLabel);
        cStmt.setInt(5, Integer.parseInt(doc_id));
        cStmt.setString(6, pubName);
        cStmt.setInt(7, Integer.parseInt(lastLoaded));
        cStmt.setInt(8, Integer.parseInt(publicV));
        cStmt.setString(9, label);
        cStmt.setString(10, description);   
        cStmt.setInt(11, Integer.parseInt(out_id)); 

        cStmt.executeUpdate();
        }       

    }

executeUpdate(String)方法继承自Statement并尝试按原样执行给定的 SQL 语句——没有占位符替换。

所述executeUpdate()方法(无参数),在声明PreparedStatement ,将执行占位符替换。 这适用于PreparedStatements例如更新语句。

此外,您没有在此处运行直接的 SQL 语句。 您正在调用存储过程。 PreparedStatement切换到CallableStatement

CallableStatement cStmt = conn.prepareCall(sql);

“set”方法像以前一样工作,但随后您调用execute()来执行CallableStatement

要调用存储过程,您需要CallableStatement ,而不是PreparedStatement 引用CallableStatement Javadoc:

用于执行 SQL 存储过程的接口。

这是帮助您入门的示例代码:

CallableStatement cStmt = conn.prepareCall("{call insert_saved_pub_set(?,?,?,?,?,?,?,?,?,?,?)}");
cStmt.setInt(1, user_id);
// ... rest of code

boolean hadResults = cStmt.execute(); // executes the stored procedure
while (hadResults) {
    ResultSet rs = cStmt.getResultSet();

    // process result set
    ...

    hadResults = cStmt.getMoreResults();
}

我建议您阅读有关在 Java 代码中使用存储过程的MySQL 文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM