Ошибка MySQL # 2014 - Команды не синхронизированы; вы не можете запустить эту команду сейчас

Я использую MySQL, и я определяю хранимую процедуру следующим образом:

delimiter ;;
Create procedure sp_test()

  select * from name_table;
end

Когда я пытаюсь выполнить эту процедуру, я получаю эту ошибку:

#2014 - Commands out of sync; you can't run this command now 

Что это значит и что я делаю неправильно?

Ответ 1

Из Руководство

C.5.2.14. Команды не синхронизированы
Если вы получаете Commands out of sync; you can't run this command now в своем клиентском коде, вы вызываете клиент функции в неправильном порядке.

Это может произойти, например, если вы используете mysql_use_result() и попробуйте выполнить новый запрос, прежде чем вы вызовете mysql_free_result(). Это также может произойти, если вы попытаетесь выполнить два запроса, которые возвращают данные без вызова mysql_use_result() или mysql_store_result() между ними.

Это сообщение (взято из здесь)

Я решил эту проблему. Я использую MySQL-Fron вместо MySQL Query браузер. И все работает нормально.

заставляет меня думать, что это не проблема сервера или базы данных, а проблема в используемом вами инструменте.

Ответ 2

Мне удалось воспроизвести эту ошибку с MySQL и phpmyadmin:

#2014 - Commands out of sync; you can't run this command now

enter image description here В этой версии MySQL:

[email protected]:~$ mysql --version
mysql  Ver 14.14 Distrib 5.5.34, for debian-linux-gnu (x86_64) using readline 6.2

С помощью следующего SQL-кода запустите окно запроса phpmyadmin:

use my_database;
DELIMITER $$

CREATE PROCEDURE foo()
BEGIN
select 'derp' as 'msg';
END $$

CALL foo()$$           <----Error happens here, with or without delimiters.

Я не мог получить ошибку через терминал MySQL, поэтому я считаю, что это ошибка phpmyadmin.

На терминале работает нормально:

mysql> delimiter $$
mysql> use my_database$$ create procedure foo() begin select 'derp' as 'msg'; end $$ call foo() $$
Database changed
Query OK, 0 rows affected (0.00 sec)
+------+
| msg  |
+------+
| derp |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

Я думаю, что ошибка связана с изменением промежуточного запроса разделителей в phpmyadmin.

Обходной путь: Замедлите, ковбой, и запускайте свои операторы SQL по одному при использовании phpmyadmin. phpmyadmin - это "одиночный боб", он может выполнять только одну работу.

Ответ 3

Вы забыли использовать ключевое слово "Begin", а во время компиляции MySQL запутался, это должно работать:

DELIMITER ;;
Create procedure sp_test()
    BEGIN
       select * from name_table;
    END;;
DELIMITER ;

Ответ 4

Предположим, что при создании хранимой процедуры вы сохранили ее в базе данных с именем mydatabase для вызова процедуры. Перейдите в локальную базу данных и:

CALL mydatabase.sp_test();

Где sp_test() - имя вашей процедуры.

Ответ 5

Я также столкнулся с этой проблемой с C API.

Я нашел решение с последним приведенным выше примером, который говорит о разделителях.

use my_database;
DELIMITER $$

CREATE PROCEDURE foo()
BEGIN
select 'derp' as 'msg';
END $$

CALL foo()$$  

Мой код выполняет хранимую процедуру, затем проверяет возврат. Я правильно использую mysql_free_result().

Так как я не добавил в процедуру процедуры "в" процедуру, эта ошибка произошла.

Последний пример выше в одном и том же случае.

Я удалил select и, так как это нормально.

Алекс

Ответ 6

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

mysql console сообщает, однако:

ERROR 1054 (42S22): Unknown column 'latitude' in 'field list'

... что абсолютно правильно, оно было написано с ошибкой в ​​списке полей, поэтому оператор ссылался на переменную undefined.

Я должен был бы заключить, что

#2014 - Commands out of sync; you can't run this command now

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

Ответ 7

У вас есть эта проблема, очевидно, потому что оба оператора выполняются одновременно. Единственным обходным решением, которое я нашел, является закрытие соединения после sp и выполнение другого оператора на новом. Читайте об этом здесь.

Ответ 8

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

Решение:

select function .... INTO @XX;

Ответ 9

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