【问题标题】:Lost connection to MySQL server during query error when I try to use function当我尝试使用函数时查询错误期间丢失与 MySQL 服务器的连接
【发布时间】:2022-11-18 02:45:59
【问题描述】:

我正在尝试创建一个函数来检查日期范围 A 和 B 之间的任何日期是否位于日期范围 C 和 D 之间。 每当我尝试运行 MySQL Workbench 函数时,总是会抛出错误代码: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

【问题讨论】:

    标签: mysql sql mysql-workbench mysql-8.0 mysql-function


    【解决方案1】:

    您的代码创建了一个无限循环(LeaveStart < LeaveEnd 始终为真)。

    另外,如果您完全需要循环,请查看代码。按照目前的情况,您不需要它,因为 DET 的值将从上一轮循环中确定。所有其他回合都没有任何意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多