【问题标题】:MySQL use case statement into stored procedureMySQL用例语句转化为存储过程
【发布时间】:2014-09-10 22:48:45
【问题描述】:

我想在 IS NOT NULL 的存储过程中使用 CASE 语句,但是当我想保存它时出现错误:

错误:

MySQL 说:1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在附近使用的正确语法
'ELSE SET @v_delay:=0 END INSERT INTO `ts' 在第 19 行

我的存储过程:

BEGIN

    DECLARE v_user_start_time INT UNSIGNED;
    DECLARE v_delay           INT(11);
    DECLARE v_pyear           INT UNSIGNED;
    DECLARE v_mounth          INT UNSIGNED;

    SET @v_pyear     = pyear    ( _datetime_in ) ;
    SET @v_mounth  = pmonth( _datetime_in );

    SET @v_user_start_time := (SELECT `start_time` FROM `tsms_range_time` WHERE `user_id` = _user_id);

    /* Check for first record today for calculate Delay*/
    SET @v_is_new := (SELECT id from `tsms_entry_exit` WHERE `datetime_in` = NOW() );
    /* calculate USER delay */
    CASE WHEN @v_is_new  IS NOT NULL 
            THEN 
                    SET @v_delay := SEC_TO_TIME (TIME_TO_SEC(_datetime_in) - TIME_TO_SEC(@v_user_start_time)) ;
            ELSE
                    SET @v_delay:=0;
    END CASE;

INSERT INTO `tsms_entry_exit` 
        (
            `user_id`,
            `datetime_in`,
            `datetime_out`,
            `delay`,
            `period`
        )
    VALUES
        (
           _user_id,
           _datetime_in,
           _datetime_out,
           @v_delay,
           CONCAT(@v_pyear, @v_mounth)
        );
        SELECT ROW_COUNT() AS 'Affected rows';
END

【问题讨论】:

  • 反引号建议使用 MySQL,所以我删除了 sql-server 标记。

标签: mysql sql stored-procedures


【解决方案1】:

case 语句不是存储过程代码的控制流逻辑。它是查询中使用的逻辑。 if 语句是控制流逻辑。你可以做你想做的事:

SET @v_delay = (CASE WHEN @v_is_new
                     THEN SEC_TO_TIME(TIME_TO_SEC(_datetime_in) - TIME_TO_SEC(@v_user_start_time))
                     ELSE 0
                 END)

还要注意一些其他错误:

  • SET 仅使用 = 而不是 :=
  • 您不希望函数名后有空格。

【讨论】:

    【解决方案2】:

    我相信你最好在这里使用IF .. ELSE 构造,如下所示

    IF(@v_is_new  IS NOT NULL) 
    THEN 
    SET @v_delay := SEC_TO_TIME (TIME_TO_SEC(_datetime_in) - TIME_TO_SEC(@v_user_start_time)) ;
    ELSE
    SET @v_delay:=0;
    END IF; 
    

    你可以这样做

    SELECT @v_delay := CASE WHEN @v_is_new  IS NOT NULL THEN 
    SEC_TO_TIME (TIME_TO_SEC(_datetime_in) - TIME_TO_SEC(@v_user_start_time)) 
    ELSE 0 END; 
    

    【讨论】:

    • 此操作与我的 Store 过程重复,我想为此创建函数
    • 我想使用CASE 语句而不是IF
    • 您不能使用CASE 来设置多个变量,就像您尝试的方式一样。解决方法是使用IF .. ELSE 构造。
    • @v_delay 变量是单一的,我可以使用 CASE 语句。确实如此?你能邀请我聊天吗?
    • @TuxWorld,您可以将SELECTCASE 一起使用。检查编辑的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2016-12-23
    • 2011-08-19
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多