web-dev-qa-db-ja.com

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

単一の値を変数に選択したいと思います。私は次のことを試みました:

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が取得されます。

86
Matt Bannert

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

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

DELIMITER ;

call test ();
35
Matt Bannert

私はこれと同じ問題にぶつかりましたが、混乱の原因はわかっていると思います。 MySql Query Analyzerを使用している場合、これをうまく行うことができます。

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

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

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

これらの答えは、複数の変数をうまくカバーしていません。

ストアドプロシージャでインライン割り当てを行うと、それらの結果も結果セットに送り返されます。それはわかりにくいかもしれません。複数の変数でSELECT ... INTO構文を使用するには:

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

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

34
Garr Godfrey

DECLAREの代わりにSETを使用することもできます

SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);

SELECT myvar;
18

MySQL docs DECLAREは、ストアドプログラムのようにBEGIN ... ENDブロックの開始時にのみ機能します。

14
Dan U.

MySQLで変数を宣言する必要はありません。変数のタイプは、最初に値が割り当てられたときに自動的に決定されます。タイプは、整数、10進数、浮動小数点、バイナリまたは非バイナリ文字列、または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)
9
Mike

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

SELECT ... INTO @XYZ ...

次のようなFETCH INTOグローバル変数を使用して、ではなくを使用できます。

FETCH ... INTO @XYZ

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

3
b.b3rn4rd

Windows Vistaでバージョン6(Windowsバージョン6.0.9リビジョン11421ビルド1170用のMySQL Workbench Community(GPL))を使用しています。次のオプションに問題はありません。これらの人たちが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';

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

2
Tman

select 'test' INTO @myValueのように、値の前に@記号が欠落している可能性があります。

1
HiMan

そのような問題を今すぐ実行している人のために、テーブルのエイリアスを入れてみてください、これはトリックです、例えば:

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

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

乾杯。

1
emmanuel