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 ;