Ошибка 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
В этой версии 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 вместе с потоками.
Ответ 10
Я исправил эту проблему на phpMyAdmin 4.8.6
Проблема: https://github.com/phpmyadmin/phpmyadmin/issues/14614
Запрос на извлечение: https://github.com/phpmyadmin/phpmyadmin/pull/15234
Патч: https://github.com/phpmyadmin/phpmyadmin/pull/15234/files#diff-de1b7e9dd5969db226563678c658ea67
Патч состоит из, и если mysqli_more_results, то вызов mysqli_next_result