簡體   English   中英

MySQL用例語句放入存儲過程

[英]MySQL use case statement into stored procedure

我想在存儲過程中使用CASE語句表示IS NOT NULL但是在保存時出現錯誤:

錯誤:

MySQL說:1064-您的SQL語法有錯誤; 檢查與您的MySQL服務器版本相對應的手冊,以在附近使用正確的語法
'ELSE SET @v_delay:= 0在第19行將END插入到'ts'中

我的存儲過程:

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

我相信您最好使用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; 

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僅使用=而不使用:=
  • 您不希望在函數名稱后添加空格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM