【问题标题】:Stored Procedure does not work when called but prepared Statement does存储过程在调用时不起作用,但准备好的语句可以
【发布时间】:2015-05-18 10:52:23
【问题描述】:

我的问题是,我在 mysql 中创建了一个存储过程。我试图通过我的 java 代码调用这个过程。

我没有得到任何异常,但数据库不受影响。如果我做 通过preparedstatement的相同声明一切正常。 如果我在工作台中手动调用该过程,它也可以工作。

存储过程

CREATE DEFINER=`root`@`localhost`PROCEDURE `delete`(IN id INT(11))
BEGIN SET SQL_SAFE_UPDATES=0; Delete from sender where id = id; 
END

调用代码

        public void deleteSender(int id){
        CallableStatement cStmt = null;
        PreparedStatement pStmt = null;
        PreparedStatement pStmt_2 = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "root","");

String call = "{call delete(?)}";
cStmt = connection.prepareCall(call);
cStmt.setInt(1, id);
boolean b = cStmt.execute();


        } catch (Exception e) {

        }

    }

As prepared Statement:

    public void deleteSender(int id){

        CallableStatement cStmt = null;
        PreparedStatement pStmt = null;
        PreparedStatement pStmt_2 = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "root","");

            pStmt = connection.prepareStatement("Delete from sender where id="+id);
            pStmt_2 = connection.prepareStatement("Delete from  table2 where sender_id="+id);

            boolean b = pStmt.execute();
            boolean b_2 = pStmt_2.execute();
            if(b == false || b_2 == false){
                JOptionPane.showMessageDialog(null, "Data deleted");
            }
        } catch (Exception e) {

        }

有什么想法吗??

【问题讨论】:

  • 1.您在第一部分中没有遇到异常因为您似乎没有处理它们(第二部分也是如此)。 2.您的第二部分不是准备好的语句,您仍在将id 值连接到字符串。
  • 感谢您的回答,但即使我用 syso 或其他东西捕捉到异常,它甚至无法到达那里,但在调试模式下,一切都被正确调用了。如果我将值设置为真正的准备好的语句,则第二个代码的工作方式相同,因此无论哪种方式它都可以工作......只是可调用对象没有

标签: java mysql stored-procedures


【解决方案1】:

在存储过程中,避免将其参数命名为其列的名称。将输入参数id 重命名为_id(例如),使您的存储过程如下所示:

CREATE DEFINER=`root`@`localhost` PROCEDURE `delete`(IN _id INT(11))
BEGIN
    SET SQL_SAFE_UPDATES := 0;
    DELETE FROM sender WHERE id = _id; 
END;

【讨论】:

  • 您好,谢谢您的回答。看起来我很接近,我按照你的建议更改了输入参数,但现在我得到了一个 mysql-syntax 错误。他使用了正确的 ID,但错误提示“检查与您的 MySQL 服务器版本相对应的手册,以获取在 'delete(1717)' 附近使用的正确语法......但我找不到任何语法错误:S
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多