1

当社の MySQL サーバーに新しいストアド プロシージャを追加する必要があります。ちょっと違うだけなので既存のものを流用し、追加フィールドを追加し、プロシージャの名前を変更しました。奇妙なことは、ステートメントを実行したいときに、次のように返されることです。

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

この行の 0 を参照: SET @update_id := 0; 奇妙なのは、 SHOW CREATE PROCEDURE を使用してそのストアド プロシージャをクエリしたことです。データベースに保存され、正常に動作しています。新しいストアド プロシージャとして使用することはできません (新しいテスト データベースに適用しようとしても、新しい名前を付けて既存のデータベースで使用しても)。解決策をインターネットで検索しました。残念ながら役に立ちません。新しいテーブルといくつかのデモ値を使用して新しいデータベースをセットアップし、元の変更されていないストアド プロシージャを実行しようとしました。まったく同じエラーが返されます。

私が話している現在使用され、機能しているストアドプロシージャは次のとおりです。

CREATE DEFINER=`root`@`localhost` PROCEDURE `customer_getcard`(IN Iinstance INT, IN Itimebuy DOUBLE, IN Iprice DECIMAL(10,2), IN Itariff INT, IN Icomment VARCHAR(128))
BEGIN
  SET @update_id := 0;
  UPDATE customer_shop SET state = 1, id = (SELECT @update_id := id), instance=Iinstance, timebuy=Itimebuy, price=Iprice, comment=Icomment WHERE tariff=Itariff AND state = 0 LIMIT 1; 
  SELECT * FROM customer_shop WHERE id = @update_id;
END

何が悪いのか完全にわからないので、皆さんが私を助けてくれることを願っています。:/

よろしく、マーク

4

2 に答える 2

1

代わりのコマンド区切り文字を定義する必要があります。MySQL は現在、CREATE PROCEDUREコマンドが最初;に遭遇した時点 (3 行目、 の後) で終了すると考えているため、これは a の後、対応する の前にある0ため、構文エラーになります。BEGINEND

DELIMITER ;; -- or anything else you like

CREATE PROCEDURE
  ...
END;;        -- use the new delimiter you chose above here

DELIMITER ;  -- reset to normal
于 2012-05-02T10:27:35.730 に答える
0

MySQL ストアド プロシージャは、値の割り当てに ":=" を使用せず、単に "=" を使用します。

また、「id = (SELECT @update_id := id)」が受け入れられるとは思わないでください。代替ソリューションは次のとおりです(テストされていません):

CREATE DEFINER=`root`@`localhost` PROCEDURE `customer_getcard`(IN Iinstance INT, IN Itimebuy DOUBLE, IN Iprice DECIMAL(10,2), IN Itariff INT, IN Icomment VARCHAR(128))
BEGIN
  select id into @update_id from customer_shop WHERE tariff=Itariff AND state = 0 LIMIT 1;
  UPDATE customer_shop SET state = 1, instance=Iinstance, timebuy=Itimebuy, price=Iprice, comment=Icomment where id = @update_id;
  SELECT * FROM customer_shop WHERE id = @update_id;
END

編集する一致する行がない場合に備えて、エラー ハンドラを配置することもできます。

于 2012-05-02T09:59:01.713 に答える