[英]Procedure that does not UPDATE a table row
我有这个程序(不要太费心去弄清楚它的作用,针对名为“Modify 1,2,3,4”的评论)
/* PROCEDURE 1 : Post notification */
DROP PROCEDURE IF EXISTS AddNotificationOnPosts;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `AddNotificationOnPosts`(arg_from_user INT(11),arg_on_post_id INT(11),arg_in_group_id INT(11))
BEGIN
DECLARE num_rows INT DEFAULT NULL;
DECLARE insert_result INT DEFAULT NULL;
DECLARE user_id INT DEFAULT NULL;
DECLARE done INT DEFAULT 0;
DECLARE var_user_id INT DEFAULT NULL;
DECLARE c1 CURSOR FOR
SELECT user_id
FROM user_rights
WHERE user_rights.right = 101 AND user_rights.group_id = arg_in_group_id
ORDER BY user_id DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
IF(arg_from_user IS NULL OR arg_from_user = '')
THEN
SELECT "0" AS response;
ELSEIF(arg_on_post_id IS NULL OR arg_on_post_id = '')
THEN
SELECT "0" AS response;
ELSEIF(arg_in_group_id IS NULL OR arg_in_group_id = '')
THEN
SELECT "0" AS response;
ELSE
SELECT count(notification_id) FROM notifications_posts
WHERE
from_user = arg_from_user AND
on_post_id = arg_on_post_id AND
in_group_id = arg_in_group_id
INTO num_rows;
/* MODIFY 1*/
UPDATE user_info SET notifications = 1 WHERE user_id = 145;
END IF;
IF num_rows = 0
THEN
INSERT INTO notifications_posts(from_user,on_post_id,in_group_id) VALUES(arg_from_user,arg_on_post_id,arg_in_group_id);
SELECT ROW_COUNT() INTO insert_result;
/* MODIFY 2*/
UPDATE user_info SET notifications = 1 WHERE user_id = 1;
IF insert_result > 0
THEN
/* MODIFY 3*/
UPDATE user_info SET notifications = 1 WHERE user_id = 5;
/* Increment the notifications for every user*/
OPEN c1;
read_loop: LOOP
FETCH c1 INTO var_user_id;
IF done THEN
LEAVE read_loop;
ELSE
/* MODIFY 4*/
UPDATE user_info SET notifications = 1 WHERE user_id = 1;
END IF;
END LOOP;
CLOSE c1;
SELECT "1" AS response;
ELSE
SELECT "0" AS response;
END IF;
ELSE
SELECT "0" AS response;
END IF;
END $$
DELIMITER ;
这工作得很好,除了线条
UPDATE user_info SET notifications = 1 WHERE user_id = 1;
不会工作,但在简单的普通 SQL(phpmyadmin) 中,这个查询工作正常。 问题是什么?
这个脚本是做什么的? 它可以帮助我向某些用户发布通知,并且当您在group1中发布内容时,必须通知所有在该组中拥有right101的用户,例如
UPDATE user_info SET notifications = notifications + 1 WHERE user_id = var_user_id;
像我以前在 PHP 中那样使用游标作为FOR LOOP
这有什么问题? 程序不能更新数据?! 希望我让自己可以理解。
听起来不是冒昧,但数据是否允许您通过
IF num_rows = 0
作为提示,如果您在 SQL Management Studio 中运行,您可以像普通代码一样使用断点调试您的 sql。 我建议在该行上放置一个断点,看看它是否真的被击中。
这些方面的东西怎么样? 我通常在 SQL Server 中工作,所以如果某些语法不正确,我深表歉意,但我发表了一些评论,所以我希望你明白要点。
/* PROCEDURE 1 : Post notification */
DROP PROCEDURE IF EXISTS AddNotificationOnPosts;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `AddNotificationOnPosts`(arg_from_user INT(11), arg_on_post_id INT(11), arg_group_id INT(11))
BEGIN
-- sanity checks
IF(arg_from_user IS NULL OR arg_from_user = '')
THEN
RETURN 0;
ELSEIF(arg_on_post_id IS NULL OR arg_on_post_id <= 0)
THEN
RETURN 0;
ELSEIF(arg_in_group_id IS NULL OR arg_in_group_id <= 0)
THEN
RETURN 0;
END IF;
BEGIN TRAN;
-- insert if notification post does not exist
IF NOT EXISTS
(
SELECT *
FROM notification_posts
WHERE
from_user = arg_from_user AND
on_post_id = arg_on_post_id AND
in_group_id = arg_in_group_id
)
THEN
INSERT INTO notifications_posts
(
from_user,
on_post_id,
in_group_id
)
VALUES
(
arg_from_user,
arg_on_post_id,
arg_in_group_id
);
END IF;
-- update all users with 101 right
UPDATE ui
SET notifications = notifications + 1
FROM user_info ui
JOIN user_rights ur on ur.user_id = ui.user_id
WHERE ur.right = 101 and ur.group_id = arg_in_group_id
COMMIT;
END $$
DELIMITER ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.