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



我想做一个函数,检查日期范围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:safe update,可以在驱动程序代码前使用SET SQL_SAFE_UPDATES=0禁用它。如果有人能解释一下为什么会抛出这个错误,那就太好了。

DB-Fiddle: 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 ;

你的代码创建了一个无限循环(LeaveStart <LeaveEnd总是true)。>

另外,如果需要循环,请查看代码。就目前而言,您不需要它,因为DET的值将从最后一轮循环中确定。其他所有回合都没有意义。

你可以简单地做:

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

相关内容

  • 没有找到相关文章