MySQL Error 2014 - команды не синхронизированы - при попытке вызвать последовательные хранимые процессы - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть иерархическая таблица MySQL с использованием модели Nested Set.Я создал сохраненный процесс, который позволяет мне удалить организацию.

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

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

Вот SQL, который я запускаю:

SELECT @id := id, 
       @parent_id := parent_id 
  FROM organization 
 WHERE name = 'TESTDEAL';

CALL deleteOrg(@id);
CALL deleteOrg(@parent_id);

А вот моя хранимая процедура:

DELIMITER $$

CREATE PROCEDURE deleteOrg(IN IN_ID INT)

MODIFIES SQL DATA

BEGIN 

    START TRANSACTION;

    SELECT @org_id := id, 
           @myLeft := lft, 
           @myRight := rgt,  
           @myWidth := rgt - lft + 1 
      FROM organization 
     WHERE id = IN_ID;

    # delete statements for removing roles and other dependencies

    DELETE FROM organization 
     WHERE id = @org_id;

    UPDATE organization 
       SET rgt = rgt - @myWidth 
     WHERE rgt > @myRight;

    UPDATE organization 
       SET lft = lft - @myWidth 
     WHERE lft > @myRight;

    COMMIT;

END;
$$

DELIMITER ;

Почему вторая команда терпит неудачу?MySQL пытается выполнить вторую команду CALL до того, как первая будет зафиксирована?Есть ли способ заставить первый полностью выполнить выполнение перед вызовом второго?

РЕДАКТИРОВАТЬ: организационная таблица использует InnoDB

РЕДАКТИРОВАТЬ: Попытка удаления START TRANSACTION;и COMMIT;но я все еще получаю ту же ошибку

Ответы [ 3 ]

1 голос
/ 01 ноября 2010

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

Мой совет - объявлять локальные переменные внутри вашей процедуры и назначать их с помощью SELECT...INTO.В целом, это хорошая практика, которая может помочь вам решить вашу проблему.

Вот как будет выглядеть ваша процедура:

DELIMITER $$

DROP PROCEDURE IF EXISTS deleteOrg $$

CREATE PROCEDURE deleteOrg(IN IN_ID INT)

MODIFIES SQL DATA

BEGIN 
  DECLARE V_ORG_ID INT;
  DECLARE V_MY_LEFT INT;
  DECLARE V_MY_RIGHT INT;
  DECLARE V_MY_WIDTH INT;

    START TRANSACTION;

    SELECT id, 
           lft, 
           rgt, 
           rgt - lft + 1
      into V_ORG_ID, 
           V_MY_LEFT, 
           V_MY_RIGHT,  
           V_MY_WIDTH
      FROM organization 
     WHERE id = IN_ID;

    -- delete statements for removing roles and other dependencies

    DELETE FROM organization 
     WHERE id = V_ORG_ID;

    UPDATE organization 
       SET rgt = rgt - V_MY_WIDTH 
     WHERE rgt > V_MY_RIGHT;

    UPDATE organization 
       SET lft = lft - V_MY_WIDTH 
     WHERE lft > V_MY_LEFT;

COMMIT;

END;
$$

DELIMITER ;
0 голосов
/ 10 августа 2012

Я тоже ищу ответ, AFAIK, он связан с набором записей, возвращенным первым SP. Вы должны «прочитать» набор записей, чтобы очистить его, а затем сделать новый вызов.

0 голосов
/ 01 ноября 2010

Ошибка возникает только при импорте сценария SQL из phpMyAdmin. Импорт сценария из командной строки или использование командной строки не приводит к ошибке. Я предполагаю, что эта ошибка связана с phpMyAdmin, а не MySQL. (Я также видел другое странное поведение phpMyAdmin в отношении хранимых процедур - я использую phpMyAdmin v3.3.2)

...