3

次のコードを使用して、プログラムで新しいストアド プロシージャを作成しようとしています。

using (MySqlConnection conn = new MySqlConnection(connectionString))
            {
                conn.Open();

                using (MySqlTransaction trans = conn.BeginTransaction())
                {
                    using (MySqlCommand command = conn.CreateCommand())
                    {
                        command.CommandText = query;

                        command.ExecuteNonQuery();
                    }

                    trans.Commit();
                }
            }

そして、Mysql ワークベンチからコピーされた create ステートメントとしての次のテキスト:

static string query = @"
delimiter $$

CREATE PROCEDURE `GetParentIds`(IN `tempTableName` VARCHAR(255), IN `id` int)
BEGIN
DECLARE parId INT;
DECLARE curId INT;

  DROP TEMPORARY TABLE IF EXISTS tempTableName;

  CREATE TEMPORARY TABLE tempTableName (
node_id INT NOT NULL PRIMARY KEY
   );

 set curId := id;
 get_parents_loop: LOOP
     set parId := null;

     set parId = (select ParentID from {TableName} where ID = curId);

    IF parId is NULL THEN
       LEAVE get_parents_loop;
    END IF;

    INSERT INTO tempTableName(node_id) Values (parId);
    set curId := parId;

END LOOP get_parents_loop;
  SELECT *
     FROM tempTableName;
END$$";

このプロシージャは、parentID を持つオブジェクトの ID を渡され、指定されたオブジェクトのすべての親のすべての parentID を取得して返します。実行しようとすると問題が発生し、次のメッセージが表示されます:「SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルを参照して、'delimiter $$

CREATE PROCEDURE GetParentIds(IN tempTableNameVARCHAR(255),' at line 1"

どんなアイデアでも大歓迎です!

*編集** 以下のすべての回答のおかげで、これが最終的に機能しました:

CREATE PROCEDURE GetParentIds(IN tempTableName VARCHAR(255), IN id int)
BEGIN
DECLARE parId INT;
DECLARE curId INT;

DROP TEMPORARY TABLE IF EXISTS tempTableName;

 CREATE TEMPORARY TABLE tempTableName (node_id INT NOT NULL PRIMARY KEY  );

set curId := id;
get_parents_loop: LOOP
    set parId := null;

    set parId = (select ParentID from TDOs where TDOID = curId);

    IF parId is NULL THEN
       LEAVE get_parents_loop;
    END IF;

    INSERT INTO tempTableName(node_id) Values (parId);
    set curId := parId;

END LOOP get_parents_loop;
  SELECT *
    FROM tempTableName;
END;
4

1 に答える 1

10

DELIMITER $$先頭と$$最後以降を削除END

DELIMITERは、ストアド ルーチンを定義する際にステートメント ターミネータを一時的に変更できるようにするmysql クライアント コマンドです。

ステートメント ターミネータとしてセミコロンを使用しないプログラミング インターフェイス内からストアド ルーチンを定義する場合、ストアド ルーチン定義内のセミコロンは特別な問題を引き起こしません。

于 2013-08-09T01:59:43.087 に答える