当我尝试使用函数时,在查询错误期间丢失与MySQL服务器的连接

jjhzyzn0  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(95)

我试图使一个函数,检查是否任何日期之间说日期范围A和B之间的C和D之间的日期。每当我尝试运行该函数MySQL工作台总是抛出一个错误代码:2013丢失连接到MySQL服务器在查询期间。我假设这个错误是由于循环永远运行(请纠正我,如果我认为它完全错误)。
表格代码:

CREATE TABLE TESTING(
LeaveStart DATE,
LeaveEnd DATE,
ProjectStart DATE,
ProjectEnd DATE,
Det BOOL,
ID INT);

值插入代码:

INSERT INTO TESTING VALUES('2018-01-01','2018-01-31','2018-01-10','2018-01-30',FALSE,1);
INSERT INTO TESTING VALUES('2018-01-01','2018-01-31','2018-01-10','2018-01-30',FALSE,2);

功能:

DELIMITER //
CREATE FUNCTION SALARY_DEDUCTION (LeaveStart Date, LeaveEnd Date, ProjectStart DATE, ProjectEnd Date)
RETURNS BOOL NO SQL
DETERMINISTIC 
BEGIN
    DECLARE DET BOOL DEFAULT FALSE;
    DECLARE DT DATE DEFAULT LeaveStart;
    WHILE LeaveStart < LeaveEnd DO
    IF DT BETWEEN ProjectStart AND ProjectEnd THEN
    SET DET = TRUE;
    ELSE 
    SET DET = FALSE;
    SET DT = DATE_ADD(DT, INTERVAL 1 DAY);
    END IF;
    END WHILE;
    RETURN DET;
END ; //

DELIMITER ;

呼叫/驱动程序代码:

UPDATE TESTING AS T
SET 
T.Det = SALARY_DEDUCTION(T.LeaveStart,T.LeaveEnd,T.ProjectStart,T.ProjectEnd)
WHERE 
T.ID=1;

注意:驱动程序代码可能会抛出错误代码1175:安全更新,可以在驱动程序代码前使用SET SQL_SAFE_UPDATES=0来禁用它。如果有人也能解释为什么它会抛出错误,那就太好了。
DB-小提琴:https://www.db-fiddle.com/f/4Bof1gdHRnkSYJwVZekRJ9/1
编辑:

DELIMITER //
CREATE FUNCTION SALARY_DEDUCTION_3(LeaveStart Date, LeaveEnd Date, ProjectStart DATE, ProjectEnd Date)
RETURNS BOOL NO SQL
DETERMINISTIC 
BEGIN
    DECLARE DET BOOL DEFAULT FALSE;
    DECLARE CD DATE DEFAULT LeaveStart;
    myloop: WHILE CD < LeaveEnd DO
    IF CD BETWEEN ProjectStart AND ProjectEnd THEN
    SET DET = TRUE;
    LEAVE myloop;
    END IF;
    SET CD = DATE_ADD(CD, INTERVAL 1 DAY);
    END WHILE myloop;
    RETURN DET;
END ; //

DELIMITER ;
bis0qfac

bis0qfac1#

您的程式码会建立无限循环(LeaveStart〈LeaveEnd永远为true)。
另外,如果你需要这个循环的话,请看一下代码。就目前的情况来看,你不需要它,因为DET的值将由最后一轮循环决定。所有其他的循环都没有意义。
您可以简单地执行以下操作:

UPDATE TESTING
SET Det = (LeaveStart<ProjectEnd AND LeaveEnd>=ProjectStart AND LeaveStart<LeaveEnd)
WHERE ID=1;

相关问题