Невозможно выполнить запрос в синтаксической ошибке 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".
Я этого не понимаю, но мне нужно что-то сделать, поэтому я двигаюсь дальше.
Я делаю более простой запрос:
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.
Далее я захожу в phpMyAdmin, чтобы попробовать запустить что-то оттуда, используя его базу данных:
SET @Count=Count(id) FROM `tbl_object_users` WHERE `username`='jp2code';
Это тоже говорит мне, что у меня ошибка в синтаксисе SQL.
Я загрузил и установил новейший верстак 6, но это не решило проблему - и мне не понравился интерфейс, поэтому я удалил его и вернулся к верстаку 5.2.
Что происходит? SQL не так уж и сложен, так что же с этими препятствия?
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
является :=
( двоеточие равно), а не просто =
.
Попробуйте это
DELIMITER $$
DROP PROCEDURE IF EXISTS my_test$$
CREATE PROCEDURE my_test()
BEGIN
SELECT * FROM `customer_to_pay`;
END $$
DELIMITER ;