m_smith Ответов: 2

Код Mysql, продолжайте получать синтаксическую ошибку


Эй ребята,
Я новичок в MySQL, задача состоит в том, чтобы написать procudure, который увеличивает значение 'egysegar' там, где 'alapanyag.nev' содержит входные данные ('alapag'). Я постоянно получаю сообщение "синтаксическая ошибка". Я просто продолжаю проверять примеры на разных сайтах, но не вижу проблемы. Кто-нибудь может мне помочь? Спасибо.

DELIMITER //
CREATE PROCEDURE emel (IN alapag VARCHAR(45))
DECLARE aaa VARCHAR(45);
DECLARE notFound CONDITION FOR
	SQLSTATE '02000';
DECLARE c CURSOR FOR (SELECT nev FROM alapanyag);
BEGIN
	OPEN c;
    thisLoop:LOOP
        FETCH c INTO aaa;
        IF notFound THEN
            LEAVE thisLoop;
        END IF;
        IF aaa LIKE alapag THEN
            UPDATE alapanyag;
            SET egysegar=egysegar*1.5;
        END IF;
    END LOOP;
    CLOSE c;
END //
DELIMITER ;


Сообщение об ошибке выглядит следующим образом:

Код Ошибки: 1064
У вас есть ошибка в синтаксисе SQL; проверьте соответствующее руководство
к вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с 'DECLARE aa VARCHAR(45)' в строке 2

Версия Сервера MySQL: 10.4.8-MariaDB

Что я уже пробовал:

Продолжайте проверять сайты. Я использую phpMyAdmin, если это помогает.
Также добавлен разделитель в код (отредактирован) и удалено объявление, как кто-то предложил на другом сайте.

Patrice T

Точное сообщение об ошибке пожалуйста
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

m_smith

Добавлено в конце. Спасибо за ваши усилия.

2 Ответов

Рейтинг:
9

m_smith

Ладно, спасибо вам, ребята, за ваши усилия, похоже, я нашел решение. По-видимому, DECLARE должен быть в блоке (BEGIN-END), а также должен был изменить способ обработки SQLSTATE '02000'.

DELIMITER //
CREATE PROCEDURE emel (IN alapag VARCHAR(45))
BEGIN
	DECLARE aaa VARCHAR(45);
    DECLARE atEnd SMALLINT DEFAULT 0;
    DECLARE notFound CONDITION FOR SQLSTATE '02000';
	DECLARE c CURSOR FOR (SELECT nev FROM alapanyag);
    DECLARE CONTINUE HANDLER FOR notFound            
      SET atEnd = 1;
	OPEN c;
    thisLoop:LOOP
        FETCH c INTO aaa;
        IF atEnd<>0 THEN
            LEAVE thisLoop;
        END IF;
        IF aaa LIKE alapag THEN
            UPDATE alapanyag
            SET egysegar=egysegar*1.5;
        END IF;
    END LOOP;
    CLOSE c;
END //
DELIMITER ;


Рейтинг:
0

Maciej Los

Проверить это: mysql - синтаксическая ошибка Mariadb 1064 (42000) - переполнение стека[^]

Есть два возможных решения:

Ответ № 1


Копирование и вставка вашего кода в NotePad++, а затем просмотр его в шестнадцатеричном редакторе показывает, что у вас есть 80 8b 0a в каждой из этих пустых строк между операторами.

Что последовательность байтов в кодировке UTF-8 бланк нулевой ширины пробела.

Проследите, чтобы вы их убрали – тогда это должно сработать.

(Если вы используете NotePad++ и плагин hex editor, то в hex view вы можете просто заменить e2 80 8b пустой строкой. В противном случае, в любом другом текстовом редакторе, перейдя в конец предыдущей строки, выделив все оттуда по пустой строке до начала следующей строки, а затем заменив выделение нажатием клавиши enter, также должно работать.)


Ответ № 2:

У меня было такое же разочарование, и я обнаружил, что мне нужно изменить свой разделитель вокруг моей процедуры. Возможно, она будет работать тоже здесь.

DELIMITER //
CREATE PROCEDURE
....
BEGIN
END //
DELIMITER ;

Это было записано в документации под ссылка[^] вы предоставили в комментарии к решению № 1 MadMyche.