2016-03-01 3 views
0

MySQL 5,6MySQL хранимые процедуры - "У вас ошибка в вашем SQL синтаксиса"

CREATE PROCEDURE test() 
BEGIN 
DECLARE _idKeep INT; 
SET _idKeep = 1; 
PREPARE string FROM "UPDATE users set firstname='Joe' where id=?"; 
EXECUTE string USING _idKeep; 
/*SELECT _idKeep;*/ 
END 

Сообщение об ошибке:

У Вас есть ошибка в вашем SQL синтаксиса; проверьте, что соответствует вашей версии сервера MySQL для правильного синтаксиса для использования рядом с '_idKeep;

Если я прокомментирую инструкцию PREPARE и EXECUTE и раскомментирую инструкцию SELECT, сообщение об ошибке исчезнет. Почему это так?

ответ

1

Вы не можете использовать локальную переменную в своем запросе, только определяемую пользователем переменную.

Значения параметров могут предоставляться только пользовательскими переменными, а предложение USING должно указывать ровно столько переменных, сколько количество маркеров параметров в инструкции.

http://dev.mysql.com/doc/refman/5.7/en/execute.html

Пользовательские переменные одного сеанса. Пользовательская переменная, определенная одним клиентом, не может быть видна или использована другими клиентами. (Исключение: пользователь, имеющий доступ к таблице производительности, user_variables_by_thread, может видеть все пользовательские переменные для всех сеансов.) Все переменные для данного сеанса клиента автоматически освобождаются при выходе этого клиента.

http://dev.mysql.com/doc/refman/5.7/en/user-variables.html

Поскольку локальные переменные в области видимости только во время выполнения хранимой программы, ссылки на них не допускаются в подготовленных инструкций, созданных в рамках хранимой программы. Подготовленная область отчета - это текущий сеанс, а не сохраненная программа, поэтому оператор может быть выполнен после завершения программы, после чего переменные больше не будут в области видимости. Например, SELECT ... INTO local_var не может использоваться как подготовленный оператор. Это ограничение также относится к хранимым процедурам и параметрам функции.

http://dev.mysql.com/doc/refman/5.7/en/local-variable-scope.html

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

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

http://dev.mysql.com/doc/refman/5.7/en/prepare.html

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

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