'Пока' l oop не выходит через заданное количество секунд - PullRequest
2 голосов
/ 08 мая 2020

Цель состоит в том, чтобы сделать его занятым в течение 'n' секунд, а затем выйти. Это последняя версия кода. Я пробовал напрямую date1 < date2 в while, et c

delimiter $$
CREATE  FUNCTION `DelayResponse`(pSeconds int) RETURNS varchar(1)
BEGIN 
    DECLARE x int;
    DECLARE EndDateTime datetime ;
    DECLARE CurrDateTime datetime ;
    Set x = 0;
    set EndDateTime = DATE_ADD(now(), INTERVAL pSeconds second); 
    set CurrDateTime = now(); 

    WHILE x = 0 DO
        -- expecting to set x to 1 in pSeconds but nope
        if  CurrDateTime > EndDateTime then 
            set x = 1;
        end if;
        SET CurrDateTime = now(); 
    END WHILE;
    RETURN 'X';
END$$
delimiter ;

select DelayResponse(5) X

Я не могу получить здесь l oop. Что мне не хватает?

Другая версия, которая не работает. Просто спины running... без окончания

delimiter $$
CREATE  FUNCTION `DelayResponse`(pSeconds int) RETURNS varchar(1)
BEGIN 
    DECLARE x int;
    DECLARE EndDateTime datetime ;
    Set x = 0;
    set EndDateTime = DATE_ADD(now(), INTERVAL pSeconds second); 

    WHILE x <= 0 DO
            set x = now() - EndDateTime;
    END WHILE;
    RETURN 'X';
END$$
delimiter ;

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Такое поведение является результатом документированной, но менее известной особенности now () . Итак, это не ошибка !

NOW () возвращает постоянное время, которое указывает время начала выполнения оператора. (Внутри сохраненной функции или триггера NOW () возвращает время начала выполнения функции или триггерного оператора.) Это отличается от поведения SYSDATE (), который возвращает точное время, в которое он выполняется.

Итак, хотя @Barmar правильно предлагает использовать sleep(), вы можете заставить свой исходный код работать с sysdate() вместо now().

1 голос
/ 08 мая 2020

Вы можете использовать встроенную функцию SLEEP() вместо вашей собственной l oop.

delimiter $$
CREATE  FUNCTION `DelayResponse`(pSeconds int) RETURNS varchar(1)
BEGIN 
    DO SLEEP(pSeconds);
    RETURN 'X';
END$$
delimiter ;

select DelayResponse(5) X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...