MySQL DECLAREのSELECT INTO変数により構文エラーが発生しますか?


94

単一の値をSELECTして変数に入れたいのですが。私は以下を試みました:

DECLARE myvar INT(4);

-構文エラーがすぐに返されます。

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

-単一の整数を返します

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

-機能しません。@ myvarも試しました

ストアドプロシージャまたは関数の外でDECLAREを使用することはできますか?

たぶん私はユーザー変数の概念を理解していません...私は試してみました:

SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;

...想定どおりに機能しました。しかし、一度に各クエリを実行すると、@ var NULLが取得されます。

回答:


109

私はこれと同じ問題に遭遇しましたが、何が混乱を引き起こしているのか私は知っていると思います。MySqlクエリアナライザーを使用する場合は、これをうまく実行できます。

SELECT myvalue 
INTO @myvar 
FROM mytable 
WHERE anothervalue = 1;

ただし、同じクエリをMySql Workbenchに配置すると、構文エラーがスローされます。なぜ違うのかはわかりませんが、違います。MySql Workbenchで問題を回避するには、次のようにクエリを書き換えます。

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;

6
確かにそれは面白いです。質問にMySQLワークベンチタグを追加しました。そのため、この問題がMySQLワークベンチに関連していることに気付く人もいます。
Matt Bannert、2011

1
MySQL Workbenchバージョン5.2.47 rev 10398をFedora 18で使用しましたが、そのような問題はありません。
GoYun.Info 2013

41

結局、ストアドプロシージャが私の問題の解決策でした。助けになったのは次のとおりです。

DELIMITER //
CREATE PROCEDURE test ()
  BEGIN
  DECLARE myvar DOUBLE;
  SELECT somevalue INTO myvar FROM mytable WHERE uid=1;
  SELECT myvar;
  END
  //

DELIMITER ;

call test ();

テスト用のThx ...興味深いですね。残念ながら、最後の文は取得できません。一、二言忘れましたか?
Matt Bannert、2011年

39

これらの回答は、複数の変数をあまりカバーしていません。

ストアドプロシージャでインライン割り当てを行うと、それらの結果も結果セットに返送されます。それは混乱する可能性があります。複数の変数でSELECT ... INTO構文を使用するには、次のようにします。

SELECT a, b INTO @a, @b FROM mytable LIMIT 1;

SELECTは1行のみを返す必要があるため、必ずしも1行である必要はありませんが、LIMIT 1です。


私も同じことをしようとしていましたが、@なしの変数もうまくいきました。ありがとう
Anand Rockzz

2
はい、ストアドプロシージャでは、変数を@で始める必要はありません。しかし、その方法を説明する方が簡単です。
Garr Godfrey 2017


15

MySQLのドキュメントによると DECLAREは、ストアドプログラムの場合と同様に、BEGIN ... ENDブロックの開始時にのみ機能します。


「mysql select inside procedure」を探してここに到着した後、最初に宣言がないことがsyntax error, missing ;エラーの原因でした。
Miguel Pynto

12

MySQLで変数を宣言する必要はありません。変数のタイプは、最初に値が割り当てられたときに自動的に決定されます。そのタイプは、整数、10進数、浮動小数点、2進または非2進ストリング、またはNULL値のいずれかです。詳細については、ユーザー定義変数のドキュメントを参照してください。

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

SELECT ... INTOを使用して、変数に列を割り当てることができます。

http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html

例:

mysql> SELECT 1 INTO @var;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @var;
+------+
| @var |
+------+
| 1    |
+------+
1 row in set (0.00 sec)

1
うーん、どういうわけか私はここで困っています。SELECT 1 INTO @var; 構文エラーも返します。そうします:SELECT somevar INTO @var FROM mytable; 多分それはDELIMITERの問題ですか?
Matt Bannert 2010年

どのようなエラーが発生していますか?MySQLのどのバージョンを使用していますか?
Mike

エラーコード:1064。SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、3行目の 'INTO @var'の近くで使用する正しい構文を確認してください。バージョン= 5.5.16
Scott Willeke

4

次のSELECT INTOようなグローバル変数を使用できるという事実にもかかわらず、注目に値します。

SELECT ... INTO @XYZ ...

次のようなグローバル変数は使用できませんFETCH INTO

FETCH ... INTO @XYZ

バグではないようです。私はそれが誰かに役立つことを願っています...


3

Windows Vistaでバージョン6(MySQL Workbench Community(GPL)for Windowsバージョン6.0.9リビジョン11421ビルド1170)を使用しています。以下のオプションで問題ありません。これらの人が3年前に問題を抱えていたので、おそらく彼らはそれを修正しました。

/* first option */
SELECT ID 
INTO @myvar 
FROM party 
WHERE Type = 'individual';

-- get the result
select @myvar;

/* second option */
SELECT @myvar:=ID
FROM party
WHERE Type = 'individual';


/* third option. The same as SQL Server does */
SELECT @myvar = ID FROM party WHERE Type = 'individual';

上記のすべてのオプションで正しい結果が得られます。


3

現在このような問題に直面している人のために、単にテーブルのエイリアスを付けてみてください、これはトリックです:

SELECT myvalue 
  INTO myvar 
  FROM mytable x
 WHERE x.anothervalue = 1;

それは私のために働いた。

乾杯。


1

このように、値の前に@記号がない場合がありselect 'test' INTO @myValueます。


それはセッション変数であり、別のトピックです
Adam F

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.