我调用一个过程,它运行,控制台显示“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
编辑以显示实际查询。我也一直在搜索,据我所知,这是一个已有一年半历史的已知问题。所以我想这个可以关闭。
最佳答案
“0 rows受影响”响应是针对存储过程中执行的最后一条语句的。
通常我通过手动将行数计入 session 变量来跟踪受影响的行数
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 后即可读取 session 变量。
我不确定是否可以通过为变量设置值来覆盖 ROW_COUNT() 函数的响应,
关于MYSQL 过程运行,但返回 0 行受影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4651967/