MYSQL程序运行,但返回0行受影响

时间:2011-01-10 21:58:04

标签: mysql stored-procedures

我调用一个程序,它运行,控制台说“0行受影响”。这是MySQL程序的正常行为吗?

程序显然正在做他们应该做的事情。一个过程有2个插入语句,另一个有插入和更新语句,我亲眼看到了结果。确实有行受到影响。

我不确定以后会使用该结果,但似乎我想从我的数据库中获得准确的响应,无论是否有任何更新,特别是在预期时。

想法?

MySQL 5.5如果重要,并且程序使用自动提交语句的事务。

CREATE DEFINER=`root`@`localhost` PROCEDURE `create_issue`(user_id SMALLINT, title varchar(255), body LONGTEXT)
BEGIN
    DECLARE MYUSERID SMALLINT;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END;
START TRANSACTION;
    INSERT INTO tracker.issue (user_id, title, body, creation_date, last_mod_date) values (user_id, title, body, CURDATE(), CURDATE());
    UPDATE user_activity SET last_new_issue = CURDATE(), post_count = post_count + 1 WHERE user_activity.user_id = user_id;
COMMIT;
END

编辑以显示实际查询。我也一直在寻找和最好,因为我可以说这是一个半年前的已知问题。所以我想这个可以关闭。

4 个答案:

答案 0 :(得分:1)

“0行受影响”响应是针对存储过程中执行的最后一个语句。

通常我会通过手动将它们计入会话变量来跟踪影响的行数

DELIMITER $$
CREATE  PROCEDURE `create_issue`(user_id SMALLINT, title varchar(255), body LONGTEXT)
BEGIN
    DECLARE MYUSERID SMALLINT;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END;
    SET @inserted_rows = 0;
    SET @updated_rows = 0;
START TRANSACTION;
    INSERT INTO tracker.issue (user_id, title, body, creation_date, last_mod_date) values (user_id, title, body, CURDATE(), CURDATE());
    SET @inserted_rows = ROW_COUNT() + @inserted_rows;
    UPDATE user_activity SET last_new_issue = CURDATE(), post_count = post_count + 1 WHERE user_activity.user_id = user_id;
    SET @updated_rows = ROW_COUNT() + @updated_rows;
COMMIT;
END
$$

然后可以在执行SP后读取会话变量。

我不确定是否可以通过将值设置为变量来覆盖ROW_COUNT()函数的响应,

答案 1 :(得分:0)

肯定是不对的。如果发生多个插入,则sproc仍应返回受影响的行数。我正在使用相同版本的MySQL,这对我来说很好。

答案 2 :(得分:0)

我猜这是一个报道的错误。对于MySQL邮件列表/论坛来说可能是一个很好的问题。 http://bugs.mysql.com/bug.php?id=44854

答案 3 :(得分:0)

你确定你没有做那样的事吗

...SET col1='value1' AND col2='value2'...

而不是

...SET COL1='value1', col2='value2'...

您可以发布存储过程吗?

相关问题