0

Nested Set モデルを使用して階層型の MySQL テーブルをセットアップしています。組織を削除できるストアド プロシージャを作成しました。

ストアド プロシージャを連続して呼び出しようとすると、2 番目の 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 ;

2 番目のコマンドが失敗するのはなぜですか? 最初の CALL コマンドがコミットされる前に、MySQL が 2 番目の CALL コマンドを実行しようとしていますか? 2番目を呼び出す前に最初のものを完全に実行させる方法はありますか?

編集: 組織テーブルは InnoDB を使用しています

編集: START TRANSACTION を削除しようとしました。およびコミット; しかし、まだ同じエラーが発生しています

4

3 に答える 3

1

これは、変数の割り当て方法と関係があると思います。

私のアドバイスは、プロシージャ内でローカル変数を宣言し、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 ;
于 2010-11-01T20:42:41.087 に答える
0

このエラーは、phpMyAdmin から SQL スクリプトをインポートするときにのみ発生しているようです。コマンド ラインからスクリプトをインポートするか、コマンド ラインを使用しても、エラーは発生しません。このエラーは、MySQL ではなく phpMyAdmin に関係していると思います。(ストアドプロシージャに関連するphpMyAdminからの他の奇妙な動作も見ました-私はphpMyAdmin v3.3.2を使用しています)

于 2010-11-01T20:39:39.680 に答える
-1

私も答えを探しています。AFAIKは、最初のSPによって返されたレコードセットに関連しています。レコードセットを「読み取って」空にしてから、新しい CALL を作成する必要があります。

于 2012-08-10T14:42:18.037 に答える