MySQL创建函数到存储过程中
在我的MySQL创建函数到存储过程中,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,在我的存储过程中我想要一个简单的函数来返回值。我想让这个Sql命令运行(这是我的过程中的重复操作): 我想在下面的存储过程中使用该函数如何执行此操作 CREATE DEFINER=`root`@`localhost` PROCEDURE `tsmsp_post_entry_exit`(IN `_id` INT(11), IN `_user_id` INT(5), IN `_datetime_in` DATETIME, IN `_datetime_out` DATETIME) NO SQL
存储过程中
我想要一个简单的函数来返回值。我想让这个Sql命令运行(这是我的过程中的重复操作):
我想在下面的存储过程中使用该函数
如何执行此操作
CREATE DEFINER=`root`@`localhost` PROCEDURE `tsmsp_post_entry_exit`(IN `_id` INT(11), IN `_user_id` INT(5), IN `_datetime_in` DATETIME, IN `_datetime_out` DATETIME)
NO SQL
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);
IF _id IS NULL THEN
/* Check for first record today for calculate Delay*/
SET @v_is_new := (SELECT COUNT(id) from `tsms_entry_exit` WHERE DATE_FORMAT(`datetime_in`, '%Y-%m-%d') = CURDATE() );
/* calculate USER delay */
IF @v_is_new IS 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;
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';
ELSE
BEGIN
/* Check for first record today for calculate Delay*/
SET @v_is_new := (SELECT COUNT(id) from `tsms_entry_exit` WHERE DATE_FORMAT(`datetime_in`, '%Y-%m-%d') = CURDATE() );
/* calculate USER delay */
IF @v_is_new IS 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;
UPDATE `tsms_entry_exit` SET
`user_id`= _user_id,
`datetime_in` = _datetime_in,
`datetime_out`=_datetime_out,
`delay`=_delay,
`period`=_period
WHERE `id` = _id;
SELECT ROW_COUNT() AS 'Affected Update rows';
END;
END IF;
END
您不能在过程中定义函数,但可以调用函数。下面是一个最简单的例子 创建您的函数
DELIMITER $$
CREATE FUNCTION getDelay(id int)
returns int
begin
SET @v_is_new := (SELECT COUNT(id) from `tsms_entry_exit`
WHERE DATE_FORMAT(`datetime_in`, '%Y-%m-%d') = CURDATE() );
IF(@v_is_new IS 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;
RETURN @v_delay;
end $$
DELIMITER ;
然后在过程中调用上面定义的函数
DELIMITER $$
CREATE PROCEDURE `tsmsp_post_entry_exit`(IN `_id` INT)
BEGIN
DECLARE v_delay INT;
IF _id IS NULL
THEN
select @v_delay := getDelay(_id); <-- Calling Here
END IF;
END $$
DELIMITER ;
分隔符$$
创建过程“tsmsp\U post\U入口\U出口”(在`\u id`INT中)
开始
声明v_delay INT;
如果_id为空
然后
选择@v_delay:=getDelay(_id)@TuxWorld,这个答案对你有帮助吗?如果是,然后考虑接受答案。
DELIMITER $$
CREATE PROCEDURE `tsmsp_post_entry_exit`(IN `_id` INT)
BEGIN
DECLARE v_delay INT;
IF _id IS NULL
THEN
select @v_delay := getDelay(_id); <-- Calling Here
END IF;
END $$
DELIMITER ;