SELECT INTO Variable in MySQL DECLARE verursacht Syntaxfehler?

94

Ich möchte einen einzelnen Wert in eine Variable AUSWÄHLEN. Ich hatte 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, auch versucht @myvar

Ist es möglich, DECLARE außerhalb gespeicherter Prozeduren oder Funktionen zu verwenden?

Vielleicht verstehe ich das Konzept der Benutzervariablen einfach nicht ... 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 gleichzeitig ausführe, bekomme ich nur @var NULL.

Matt Bannert
quelle

Antworten:

109

Ich bin auf dasselbe Problem gestoßen, aber ich glaube zu wissen, 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 jedoch dieselbe Abfrage in MySql Workbench einfügen, wird ein Syntaxfehler ausgegeben. Ich weiß nicht, warum sie anders wären, aber sie sind es. Um das Problem in MySql Workbench zu umgehen, können Sie die Abfrage folgendermaßen umschreiben:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Tim Gautier
quelle
6
Das ist in der Tat interessant. Der Frage wurde ein MySQL-Workbench-Tag hinzugefügt, sodass andere möglicherweise feststellen, dass dieses Problem mit MySQL Workbench zusammenhängt.
Matt Bannert
1
Ich habe MySQL Workbench Version 5.2.47 Rev. 10398 unter Fedora 18 verwendet und es gibt kein solches Problem damit.
GoYun.Info
41

Am Ende war eine gespeicherte Prozedur die Lösung für mein Problem. Folgendes hat geholfen:

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

DELIMITER ;

call test ();
Matt Bannert
quelle
2
Nach dem Auftreten dieses Problems scheint diese Antwort das Problem zu lösen, versucht jedoch nicht zu beschreiben, warum. Wie von anderen angegeben, ist es nicht erforderlich, die Variable zu deklarieren. 'SELECT somevalue INTO @myvar' würde genauso gut funktionieren. Bei meinen Tests habe ich festgestellt, dass der Syntaxfehler nicht ausgelöst wird, wenn die Anweisung 'SELECT x INTO y' in einer gespeicherten Prozedur verwendet wird.
Regex
Danke für die Tests ... klingt interessant. Leider bekomme ich den letzten Satz nicht. Hast du ein oder zwei Worte vergessen?
Matt Bannert
39

Diese Antworten decken MULTIPLE-Variablen nicht sehr gut ab.

Durch die Inline-Zuweisung in einer gespeicherten Prozedur werden diese Ergebnisse AUCH in der Ergebnismenge zurückgesendet. Das kann verwirrend sein. So verwenden Sie die SELECT ... INTO-Syntax mit mehreren Variablen:

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

Das SELECT darf nur 1 Zeile zurückgeben, daher LIMIT 1, obwohl dies nicht immer notwendig ist.

Garr Godfrey
quelle
Ich habe versucht, dasselbe zu tun, Variablen ohne @ haben auch für mich funktioniert. Vielen Dank
Anand Rockzz
2
Ja, in einer gespeicherten Prozedur müssen Variablen nicht mit @ beginnen. Es ist jedoch einfacher, dies zu demonstrieren.
Garr Godfrey
21

Sie können auch SET anstelle von DECLARE verwenden

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

SELECT myvar;
Somwang Souksavatd
quelle
15

Pro die MySQL - Dokumentation funktioniert nur am Anfang eines ERKLäREN BEGIN ... END - Blockes wie in einem gespeicherten Programm.

Dan U.
quelle
Nachdem ich nach 'mysql select inside procedure' gegoogelt habe und hier angekommen bin, hat das Fehlen der Deklarationen am Anfang den syntax error, missing ;Fehler für mich verursacht.
Miguel Pynto
12

Sie müssen keine Variable in MySQL deklarieren. Der Typ einer Variablen wird automatisch bestimmt, wenn ihr zum ersten Mal ein Wert zugewiesen wird. Der Typ kann einer der folgenden sein: Ganzzahl-, Dezimal-, Gleitkomma-, binäre oder nicht-binäre Zeichenfolge 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 einer Variablen Spalten 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)
Mike
quelle
1
Hmm, irgendwie bin ich hier in Schwierigkeiten. SELECT 1 INTO @var; Gibt auch einen Syntaxfehler zurück. ebenso: SELECT somevar INTO @var FROM mytable; Vielleicht ist es ein DELIMITER-Problem?
Matt Bannert
Welchen Fehler erhalten Sie? Welche Version von MySQL verwenden Sie?
Mike
Fehlercode: 1064. Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'INTO @var' in Zeile 3. Version = 5.5.16
Scott Willeke
4

Es ist erwähnenswert, dass trotz der Tatsache, dass Sie SELECT INTOglobale Variablen wie:

SELECT ... INTO @XYZ ...

Sie können nicht verwenden FETCH INTOglobale Variablen wie:

FETCH ... INTO @XYZ

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

b.b3rn4rd
quelle
3

Ich verwende Version 6 (MySQL Workbench Community (GPL) für Windows Version 6.0.9, Version 11421, Build 1170) unter Windows Vista. Ich habe kein Problem mit den folgenden Optionen. Wahrscheinlich haben sie es behoben, seit diese Jungs vor drei Jahren die Probleme 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 oben genannten Optionen geben mir ein korrektes Ergebnis.

Tman
quelle
3

Wenn Sie gerade mit solchen Problemen arbeiten, versuchen Sie einfach, einen Alias ​​für die Tabelle zu erstellen. Dies sollte der Trick sein, z.

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

Es hat bei mir funktioniert.

Prost.

Emmanuel
quelle
1

Möglicherweise verpassen Sie das @ -Symbol vor Ihrem Wert select 'test' INTO @myValue.

HiMan
quelle
Das ist eine Sitzungsvariable, ein anderes Thema
Adam F
0

SELECT c1, c2, c3, ... INTO @ v1, @ v2, @ v3, ... FROM table_name WHERE Bedingung;

Mehrdad Masoumi
quelle