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

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

delimiter ;;
Create procedure sp_test()

  select * from name_table;
end

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

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

Что это значит и что я делаю не так?

15 ответов

Из руководства

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. И все работает отлично.

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

В моем случае в моей хранимой процедуре была следующая структура:

DELIMITER //
    DROP PROCEDURE IF EXISTS processcolumns;
    CREATE PROCEDURE processcolumns ()
    BEGIN
        (...)
    END //
DELIMITER ;

CALL processcolumns ();
DROP PROCEDURE processcolumns;

Проблема здесь: DROP PROCEDURE IF EXISTS processcolumns;Я удалил точку с запятой ; и заменил его разделителем // как это:

DROP PROCEDURE IF EXISTS processcolumns //

И теперь это решено!

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

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

На этой версии MySQL:

el@apollo:~$ 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 - это "одиночный боб", он может выполнять только одну работу.

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

Я исправил эту проблему на 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

Патч состоит из, и если mysqli_more_results, то вызов mysqli_next_result

delimiter ;;
Create procedure sp_test()

  select * from name_table;
end ## no end here, must add ;; after end. should be 
delimiter ;;
Create procedure sp_test()

  select * from name_table;
end ;;

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

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

Предположим, что когда вы создали хранимую процедуру, вы сохранили ее в базе данных с именем mydatabase ВЫЗВАТЬ процедуру. Перейдите в свою локальную базу данных и:

CALL mydatabase.sp_test();

куда sp_test() это название вашей процедуры.

Похоже, у этой проблемы есть несколько источников. Ни один из опубликованных ответов не работал в моем случае, я обнаружил, что в моем случае у меня были выборки и обновления в таблице в моей хранимой процедуре, в той же таблице был триггер обновления, который запускался и отправлял процедуру в бесконечный цикл. Как только ошибка была обнаружена, ошибка исчезла.

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

Я прочитал весь этот пост, но я не могу применить какие-либо проблемы / решения к моей ошибке «Код: 2014 Команды не синхронизируются ОШИБКА; вы не можете запустить эту команду сейчас». Я создал / загрузил таблицы нормально, но мой триггер не работает с ошибкой 2014. Я переместил ";" в разные места, никуда. Я манипулировал созданной мной переменной и кнопкой «Обновить», нет. Я не могу точно определить причину проблемы. Есть идеи, пожалуйста?

       Use Sakila;                                                                                                    
/* Create 1st BEFORE DELETE trigger */ 
DELIMITER $$
DROP TRIGGER IF EXISTS Before_Salary_Table_Delete;
CREATE TRIGGER Before_Salary_Table_Delete
BEFORE DELETE
ON salaries FOR EACH ROW
BEGIN
  SET @message = ‘This record was deleted’ 
  INSERT INTO SalaryLogAudit(employeeNumber,validFrom,amount,ActionTaken)
  VALUES(OLD.employeeNumber,OLD.validFrom,OLD.amount)
  UPDATE SalaryLogAudit SET ActionTaken = @message WHERE employeenumber =
    OLD.employeeNumber;
END$$

DELIMITER;

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

Решение было:

select function .... INTO @XX;

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

У меня была эта ошибка только сейчас из-за изменения кода, которое повторно использовало соединения db в Python. Возврат кода для установления соединения с БД для каждого запроса SQL решил проблему.

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

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

use my_database;
DELIMITER $$

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

CALL foo()$$  

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

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

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

Я удалил выбор, и так как все в порядке.

Alex

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

Однако консоль mysql сообщает:

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

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

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

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

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

Другие вопросы по тегам