Я создал процедуру в своей БД ветеринарной клиники, которая показывает, что такое: первое свидание, впервые доступное с ветеринаром, уполномоченным выполнять запрошенную услугу (не должно быть других назначений забронировано одновременно). Однако, когда я вызываю эту процедуру, курсор останавливается, потому что значение eof равно 1, но на самом деле он не видел всех записей: курсор покидает цикл до конца строк! Я не понимаю, почему. вот код:Ошибка процедуры mysql db
DELIMITER //
DROP PROCEDURE IF EXISTS first_booking_available //
CREATE PROCEDURE first_booking_available(IN Perf VARCHAR(30), IN DateP DATE)
BEGIN
DECLARE IdV, eof INTEGER;
DECLARE Dat DATE;
DECLARE i, TimeB, End TIME;
DECLARE vet CURSOR FOR E.Id_vet, W.Date, S.Start_time, S.End_time
FROM Enabled E, Work W, WorkShift S
WHERE E.Code_performance = Perf AND W.Id_vet = E.Id_vet AND S.Code = W.Code_workshift AND W.Date >= DateP ORDER BY W.Date, S.Start_time;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET eof = 1;
SELECT Duration INTO @Duration FROM Perfomance WHERE Code = Perf;
SET @Start_time = NULL;
OPEN vet;
read_loop: LOOP
FETCH vet INTO IdV, Dat, TimeB, End;
IF (eof = 1 OR @Start_time IS NOT NULL) THEN
LEAVE read_loop;
END IF;
SET i = TimeB;
WHILE i < End AND @Start_time IS NULL DO
SET @P = NULL;
SET @F = NULL;
SELECT ADDTIME(ADDTIME(B.Start_time, P.Duration), '00:01:00') INTO @P
FROM Booking B, Performance P
WHERE P.Code = B.Code_performance AND B.Date = Dat AND B.Id_vet = IdV AND B.Start_time = i;
SELECT ADDTIME(ADDTIME(B.Start_time, P.Duration), '00:01:00') INTO @F
FROM Booking B, Performance P
WHERE P.Code = B.Code_performance AND B.Date = Dat AND B.Id_vet = IdV AND B.Start_time BETWEEN i AND ADDTIME(i, @Duration) ORDER BY ADDTIME(B.Start_time, P.Duration) DESC LIMIT 1;
IF @P IS NOT NULL THEN
SET i = @P;
END IF;
IF @F IS NOT NULL THEN
SET i = @F;
END IF;
IF ADDTIME(i, @duration) > End THEN
SET i = End;
END IF;
IF ((@P IS NULL) AND (@F IS NULL) AND (i != End)) THEN
SET @Start_Time = i;
END IF;
END WHILE;
IF @Start_Time IS NOT NULL THEN
SET @Id_vet = IdV;
SET @Date = Dat;
END IF;
END LOOP;
CLOSE vet;
IF @Start_Time IS NULL THEN
SIGNAL sqlstate '99994'
SET MESSAGE_TEXT = 'there is no availability !';
END IF;
END //
DELIMITER ;
Какую версию MySQL вы используете? –