[英]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.