2015-12-13 3 views
0

Я создал процедуру в своей БД ветеринарной клиники, которая показывает, что такое: первое свидание, впервые доступное с ветеринаром, уполномоченным выполнять запрошенную услугу (не должно быть других назначений забронировано одновременно). Однако, когда я вызываю эту процедуру, курсор останавливается, потому что значение 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 ; 
+0

Какую версию MySQL вы используете? –

ответ

0
DECLARE CONTINUE HANDLER FOR NOT FOUND SET eof = 1; 

это означает, что ваш запрос не имеет никакого результата. Это не относится только к курсору, другой запрос тоже.

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; 

Этот запрос не имеет результата. HANDLER поймать их. и оставьте курсор.

Смежные вопросы