0

私はこの手順を持っています(それが何をするのかをあまり気にしないでください、「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;

FOR LOOPPHPで使用していたのと同じようにカーソルを使用する

これの何が問題なのですか?プロシージャはデータを更新できませんか?! 私が自分自身を理解できるようにしたことを願っています。

4

2 に答える 2

3

おこがましいように聞こえるかもしれませんが、データはあなたが過去を乗り越えることを可能にしますか?

IF num_rows = 0

ヒントとして、SQL Management Studio で実行している場合は、通常のコードのようにブレークポイントを使用して SQL をデバッグできます。その行にブレークポイントを置いて、実際にヒットするかどうかを確認することをお勧めします。

于 2012-09-11T11:17:43.830 に答える
1

これらの線に沿ったものはどうですか?普段は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 ; 
于 2012-09-11T11:50:53.863 に答える