Использование оператора case-when в хранимой процедуре Синтаксис - PullRequest
0 голосов
/ 01 марта 2019

После изменения с IF....ELSE IF...ELSE на SWITCH.Я получаю код ошибки: 1064

Вместо IF....ELSE IF...ELSE оператор выполняет разные коды для более чем двух условий, предпочитая вышеописанное. Я изменил на SWITCH оператор, чтобы выполнить одно действие на основе разныхусловия, а затем break из условия SWITCH, выполняющего условия IF несколько раз.

Особенно с CASE WHEN FeedFlagStatus == '5' THEN

Код ошибки: 1064

У вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса, который можно использовать рядом с '= 5 ТОГДА ОБНОВЛЕНИЕ feed_item_setting SET read_status = ReadStatus WHERE' в строке 23

DELIMITER @@;

CREATE 
    PROCEDURE `saveProfileSetting`(IN `UserId` BIGINT, IN `FeedFlagStatus` INT, IN `ReadStatus` INT, IN `WriteStatus` INT, IN `WriteCmtStatus` INT) 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    BEGIN
        DECLARE userid VARCHAR(255);
        DECLARE noOfHits INT(11);
        DECLARE noOfHits2 INT(11);
        DECLARE intCode INT(11);

        SET userid = UserId;

        SET noOfHits = ( SELECT `user_id` FROM `feed_item_setting` WHERE `user_id` = UserId );
        SET noOfHits2 = ( SELECT COUNT(*) FROM `feed_item_setting` WHERE `user_id` = UserId );

            IF EXISTS (SELECT `user_id` FROM `feed_item_setting` WHERE `user_id` = UserId ) THEN  
                BEGIN

                    CASE  
                        WHEN FeedFlagStatus == 5 THEN
                            UPDATE `feed_item_setting` SET `read_status` = ReadStatus WHERE `user_id` = UserId;
                            SET intCode = FeedFlagStatus;
                        WHEN FeedFlagStatus == 6 THEN
                            UPDATE `feed_item_setting` SET `write_status` = WriteStatus WHERE `user_id` = UserId;
                            SET intCode = FeedFlagStatus;
                        WHEN FeedFlagStatus == 7 THEN
                            UPDATE `feed_item_setting` SET `write_cmt_status` = WriteCmtStatus WHERE `user_id` = UserId;
                            SET intCode = FeedFlagStatus;
                    END CASE;
                END;            
            ELSE
                BEGIN
                    CASE  
                        WHEN FeedFlagStatus == 5 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `read_status`) VALUES (UserId, ReadStatus);
                            SET intCode = FeedFlagStatus;
                        WHEN FeedFlagStatus == 6 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `write_status`) VALUES (UserId, WriteStatus);
                            SET intCode = FeedFlagStatus;
                        WHEN FeedFlagStatus == 7 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `write_cmt_status`) VALUES (UserId, WriteCmtStatus);
                            SET intCode = FeedFlagStatus;
                    END CASE;
                END;
            END IF;



        SELECT userid, noOfHits, noOfHits2, intCode;
    END;

@@;  -- Altered delimiter terminated compound statement

DELIMITER ; -- restore delimiter to standard semicolon

1 Ответ

0 голосов
/ 01 марта 2019

С начала 70-х годов, разработанный IBM, для сравнения использовался один знак равенства. Он изначально назывался структурированным английским языком запросов, поэтому предполагается, что он близок к обычному человеческому языку.

Назначение сеансапеременная обозначается :=, а присвоение переменной может быть выполнено следующим образом

DECLARE locRecord VARCHAR(255);
SELECT * INTO locRecord FROM `location_map` WHERE `user_id` = UserId;

DELIMITER @@;

CREATE 
    PROCEDURE `saveProfileSetting`(IN `UserId` BIGINT, IN `FeedFlagStatus` INT, IN `ReadStatus` INT, IN `WriteStatus` INT, IN `WriteCmtStatus` INT) 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    BEGIN
        DECLARE userid VARCHAR(255);
        DECLARE noOfHits INT(11);
        DECLARE noOfHits2 INT(11);
        DECLARE intCode INT(11);

        SET userid = UserId;

        SET noOfHits = ( SELECT `user_id` FROM `feed_item_setting` WHERE `user_id` = UserId );
        SET noOfHits2 = ( SELECT COUNT(*) FROM `feed_item_setting` WHERE `user_id` = UserId );
        -- IF ( SELECT count(*) FROM `group_users` WHERE `group_id` = groupId AND `userid` = userId AND `stataus` = 1 ) > 0 THEN


            IF EXISTS (SELECT `user_id` FROM `feed_item_setting` WHERE `user_id` = UserId ) THEN  
                BEGIN

                    CASE  
                        WHEN FeedFlagStatus = 5 THEN
                            UPDATE `feed_item_setting` SET `read_status` = ReadStatus WHERE `user_id` = UserId;
                            SET intCode:= FeedFlagStatus;
                        WHEN FeedFlagStatus = 6 THEN
                            UPDATE `feed_item_setting` SET `write_status` = WriteStatus WHERE `user_id` = UserId;
                            SET intCode:= FeedFlagStatus;
                        WHEN FeedFlagStatus = 7 THEN
                            UPDATE `feed_item_setting` SET `write_cmt_status` = WriteCmtStatus WHERE `user_id` = UserId;
                            SET intCode:= FeedFlagStatus;
                    END CASE;
                END;            
            ELSE
                BEGIN
                    CASE  
                        WHEN FeedFlagStatus = 5 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `read_status`) VALUES (UserId, ReadStatus);
                            SET intCode:= FeedFlagStatus;
                        WHEN FeedFlagStatus = 6 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `write_status`) VALUES (UserId, WriteStatus);
                            SET intCode:= FeedFlagStatus;
                        WHEN FeedFlagStatus = 7 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `write_cmt_status`) VALUES (UserId, WriteCmtStatus);
                            SET intCode:= FeedFlagStatus;
                    END CASE;
                END;
            END IF;



        SELECT userid, noOfHits, noOfHits2, intCode;
    END;

@@;  -- Altered delimiter terminated compound statement

DELIMITER ; -- restore delimiter to standard semicolon

История повторяется для тех, кто не обращает внимания, а учиться обреченыПовторить это снова.Разве это не очевидно?

...