Консультация № 188848
25.02.2016, 14:58
0.00 руб.
25.02.2016, 15:17
0 3 1
Здравствуйте! Прошу помощи в следующем вопросе:
изменил рабочую процедуру , пытаюсь создать новую
Код:
CREATE PROCEDURE bazochki()
BEGIN
DECLARE bazka INT DEFAULT (SELECT max(id_bases) FROM bases);
DECLARE oldg,oldt,oldu INT DEFAULT 0;
DECLARE oldc char(12);
WHILE bazka>0 DO
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE i,g,t,u,e INT;
DECLARE c char(12);
DECLARE cur1 CURSOR FOR SELECT id,id_gamers,color,time,updatetime,event FROM `bases-test` WHERE id_bases_list=bazka;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO i,g,c,t,u,e;
IF NOT done THEN
IF g <> oldg THEN
INSERT INTO `ilse`.`events` (`id`,`id_gamers`,`oldcolor`,`newcolor`,`up_down`,`time`)VALUES (NULL,oldg,oldc,c,'1',oldu);
INSERT INTO `ilse`.`events` (`id`,`id_gamers`,`oldcolor`,`newcolor`,`up_down`,`time`)VALUES (NULL,g,oldc,c,'2',t);
UPDATE `ilse`.`bases-test` SET event=1 WHERE id=i;
END IF;
SET oldg=g;
SET oldc=c;
SET oldu=u;
UNTIL done>0 END REPEAT;
CLOSE cur1;
END;
END WHILE;
END;

выдаёт ошибку #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'done>0 END REPEAT; CLOSE cur1; END; END WHILE; END'
я всё перепроверил ,ума не приложу почему оно ругается

Обсуждение

давно
Старший Модератор
312929
1973
25.02.2016, 17:48
общий
Адресаты:
У Вас внутри цикла REPEAT ... UNTIL два условных оператора IF один внутри другого, но только один END IF - нужно добавить еще один.
давно
Посетитель
399554
3
25.02.2016, 22:33
общий
спасибо большое, аж неудобно за панику
процедура прошла и запустилась но результат вышел неожиданным
я оказывается ещё забыл SET bazka=bazka-1; внутрь цикла вставить
чую не последняя проблема с ним, я ещё вернусь))
давно
Старший Модератор
312929
1973
01.03.2016, 03:22
общий
это ответ
Здравствуйте, serpet!

Ошибка связана с этим фрагментом:
[code lang=sql] REPEAT
FETCH cur1 INTO i,g,c,t,u,e;
IF NOT done THEN
IF g <> oldg THEN
INSERT INTO `ilse`.`events` (`id`,`id_gamers`,`oldcolor`,`newcolor`,`up_down`,`time`)VALUES (NULL,oldg,oldc,c,'1',oldu);
INSERT INTO `ilse`.`events` (`id`,`id_gamers`,`oldcolor`,`newcolor`,`up_down`,`time`)VALUES (NULL,g,oldc,c,'2',t);
UPDATE `ilse`.`bases-test` SET event=1 WHERE id=i;
END IF;
SET oldg=g;
SET oldc=c;
SET oldu=u;
UNTIL done>0 END REPEAT;[/code]
Здесь внутри цикла REPEAT ... UNTIL два условных оператора IF, вложенных один в другой, но только один END IF. Нужно добавить ещё один END IF, примерно так:
[code lang=sql] REPEAT
FETCH cur1 INTO i,g,c,t,u,e;
IF NOT done THEN
IF g <> oldg THEN
INSERT INTO `ilse`.`events` (`id`,`id_gamers`,`oldcolor`,`newcolor`,`up_down`,`time`)VALUES (NULL,oldg,oldc,c,'1',oldu);
INSERT INTO `ilse`.`events` (`id`,`id_gamers`,`oldcolor`,`newcolor`,`up_down`,`time`)VALUES (NULL,g,oldc,c,'2',t);
UPDATE `ilse`.`bases-test` SET event=1 WHERE id=i;
END IF;
SET oldg=g;
SET oldc=c;
SET oldu=u;
END IF;
UNTIL done>0 END REPEAT;[/code]
5
Форма ответа