Невозможно выполнить запрос в синтаксической ошибке MySQL непредвиденная ошибка


Я запускаю Workbench 5.2.47.

У меня есть длинная процедура, которую я написал с проверкой базовых данных. Если бы запись не существовала в базе данных, она была бы вставлена.

Процедура сохранена без проблем, но MySQL 5.5 выдает ошибку, когда я пытаюсь ее запустить.

Он длинный, и в нем много конфиденциальных данных компании, иначе я бы разместил его здесь.

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

MySQL показывает, как создать хранимую процедуру в 5.1.5 Работа с хранимыми процедурами.

Позвольте мне показать вам кое-что очень простое, что я пытаюсь написать:

DELIMITER $$
DROP PROCEDURE IF EXISTS my_test;

CREATE PROCEDURE my_test()
BEGIN
    SELECT * FROM Employees;
END $$

DELIMITER ;

При этом Workbench выдает мне ошибку "синтаксическая ошибка, неожиданное создание, ожидание $end".

screenshot CREATE

Я этого не понимаю, но мне нужно что-то сделать, поэтому я двигаюсь дальше.

Я делаю более простой запрос:

SET @Count=(SELECT Count(*) FROM tbl_object_users WHERE username='jp2code');
IF (@Count < 1) THEN
    INSERT INTO tbl_object_users (username, date_time) VALUES ('jp2code', NOW());
END IF;

Опять же, я получаю ошибка, на этот раз в моем заявлении IF.

screenshot IF

Далее я захожу в phpMyAdmin, чтобы попробовать запустить что-то оттуда, используя его базу данных:

SET @Count=Count(id) FROM `tbl_object_users` WHERE `username`='jp2code';

Это тоже говорит мне, что у меня ошибка в синтаксисе SQL.

screenshot phpMyAdmin

Я загрузил и установил новейший верстак 6, но это не решило проблему - и мне не понравился интерфейс, поэтому я удалил его и вернулся к верстаку 5.2.

Что происходит? SQL не так уж и сложен, так что же с этими препятствия?

Author: jp2code, 2014-07-31

2 answers

Проблема с этим:

DELIMITER $$
DROP PROCEDURE IF EXISTS my_test;
CREATE PROCEDURE my_test() ...

Заключается в том, что MySQL не видит точку с запятой в конце строки оператора DROP PROCEDURE как конец оператора. Это происходит потому, что предыдущая строка сообщила MySQL, что терминатор оператора был чем-то иным, чем точка с запятой. Вы сказали MySQL, что заявления будут завершены двумя знаками доллара. Таким образом, MySQL читает строку DROP PROCEDURE, ища терминатор оператора. И весь большой двоичный объект, который он читает, не является допустимым оператором MySQL, он генерирует синтаксическую ошибку.

Исправление: либо переместите строку DROP PROCEDURE перед строкой DELIMITER $$; либо завершите оператор DROP PROCEDURE указанным разделителем, а не точкой с запятой.


Вторая проблема, о которой вы сообщаете, - это синтаксическая ошибка. Это происходит потому, что MySQL не распознает IF в качестве начала допустимого оператора SQL.

Оператор IF действителен только в контексте хранимой программы MySQL (например, в операторе CREATE PROCEDURE.)

Исправление: Используйте оператор IF только в контексте хранимой программы MySQL.


Третья проблема, о которой вы сообщаете, также является синтаксической ошибкой. Это происходит потому, что у вас нет допустимого синтаксиса для оператора SET; Синтаксис MySQL для оператора SET для присвоения значения переменной пользователя:

SET @uservar = expr 

MySQL ожидает выражение после знака равенства. MySQL не ожидает SQL заявление.

Чтобы присвоить значение пользовательской переменной в результате выполнения инструкции SELECT, выполните присвоение в инструкции SELECT, например:

SELECT @Count := Count(id) FROM `tbl_object_users` WHERE `username`='jp2code'

Обратите внимание, что оператор присваивания внутри оператора SELECT является := ( двоеточие равно), а не просто =.

 6
Author: spencer7593, 2014-07-31 15:03:47

Попробуйте это

DELIMITER $$

DROP PROCEDURE IF EXISTS my_test$$

CREATE PROCEDURE my_test()
BEGIN
    SELECT * FROM `customer_to_pay`;
END $$

DELIMITER ;
 3
Author: catalinetu, 2014-07-31 14:41:13