Frage SELECT INTO-Variable in MySQL DECLARE verursacht Syntaxfehler?


Ich möchte einen einzelnen Wert in eine Variable WÄHLEN. Ich habe versucht zu folgen:

DECLARE myvar INT(4);

- gibt sofort einen Syntaxfehler zurück.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- Gibt eine einzelne Ganzzahl zurück

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- funktioniert nicht, versuchte auch @myvar

Kann DECLARE außerhalb von gespeicherten Prozeduren oder Funktionen verwendet werden?

Vielleicht bekomme ich einfach nicht das Konzept der Benutzervariablen ... Ich habe gerade versucht:

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

... was genau so funktioniert hat wie es soll. Aber wenn ich jede Abfrage zu einem Zeitpunkt ausführen, bekomme ich nur @var NULL.


75
2018-06-19 10:21


Ursprung


Antworten:


Ich bin auf dasselbe Problem gestoßen, aber ich denke, ich weiß, was die Verwirrung verursacht. Wenn Sie MySql Query Analyzer verwenden, können Sie dies problemlos tun:

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

Wenn Sie dieselbe Abfrage jedoch in MySql Workbench ablegen, wird ein Syntaxfehler ausgelöst. Ich weiß nicht, warum sie anders sein würden, aber sie sind es. Um das Problem in MySql Workbench umzugehen, können Sie die Abfrage wie folgt neu schreiben:

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

89
2017-09-07 18:46



Am Ende war eine gespeicherte Prozedur die Lösung für mein Problem. Hier hilft was:

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

DELIMITER ;

call test ();

32
2018-06-19 11:57



Diese Antworten decken MULTIPLE-Variablen nicht sehr gut ab.

Wenn Sie die Inline-Zuweisung in einer gespeicherten Prozedur ausführen, werden diese Ergebnisse ebenfalls im Resultset zurückgegeben. Das kann verwirrend sein. Um die SELECT ... INTO-Syntax mit mehreren Variablen zu verwenden, tun Sie Folgendes:

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

SELECT muss nur 1 Zeile zurückgeben, daher LIMIT 1, obwohl das nicht immer notwendig ist.


25
2017-09-09 21:51



Sie können auch SET anstelle von DECLARE verwenden

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

SELECT myvar;

17
2017-10-13 02:33



Pro die MySQL-Dokumente DECLARE funktioniert nur am Anfang eines BEGIN ... END-Blocks wie in einem gespeicherten Programm.


13
2018-06-19 10:26



Sie müssen eine Variable in MySQL nicht deklarieren. Der Typ einer Variablen wird automatisch bestimmt, wenn ihr zum ersten Mal ein Wert zugewiesen wird. Sein Typ kann einer der folgenden sein: Ganzzahl, Dezimal, Fließkomma, Binär- oder Nichtbinärzeichenfolge oder NULL-Wert. Weitere Informationen finden Sie in der Dokumentation zu benutzerdefinierten Variablen:

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

Mit SELECT ... INTO können Sie Spalten einer Variablen zuweisen:

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

Beispiel:

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)

8
2018-06-19 10:36



Es ist erwähnenswert, dass trotz der Tatsache, dass Sie können SELECT INTO globale Variablen wie:

SELECT ... INTO @XYZ ...

Sie können NICHT benutzen FETCH INTO globale Variablen wie:

FETCH ... INTO @XYZ

Sieht so aus als wäre es kein Fehler. Ich hoffe, es wird jemandem hilfreich sein ...


3
2018-01-30 03:05



Ich verwende Version 6 (MySQL Workbench Community (GPL) für Windows Version 6.0.9 Revision 11421 Build 1170) unter Windows Vista. Ich habe kein Problem mit den folgenden Optionen. Wahrscheinlich haben sie es repariert, seit diese Jungs die Probleme vor drei Jahren hatten.

/* 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';

Alle obigen Optionen geben mir ein korrektes Ergebnis.


2
2018-05-17 23:11



Vermissen Sie vielleicht das @ -Symbol vor Ihrem Wert, so select 'test' INTO @myValue;


1
2017-08-13 02:45



Für diejenigen, die gerade solche Probleme haben, versuchen Sie einfach, einen Alias ​​für die Tabelle zu setzen, dies sollte der Trick sein, zum Beispiel:

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

Es hat für mich funktioniert.

Prost.


1
2017-11-30 10:23