SELECT INTO Variable dans MySQL DECLARE provoque une erreur de syntaxe?

94

Je voudrais SELECTIONNER une seule valeur dans une variable. J'avais essayé de suivre:

DECLARE myvar INT(4);

- renvoie immédiatement une erreur de syntaxe.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- renvoie un seul entier

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- ne fonctionne pas, a également essayé @myvar

Est-il possible d'utiliser DECLARE en dehors des procédures ou fonctions stockées?

Peut-être que je ne comprends tout simplement pas le concept de variables utilisateur ... J'ai juste essayé:

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

... qui a fonctionné comme prévu. Mais si j'exécute chaque requête à la fois, j'obtiens simplement @var NULL.

Matt Bannert
la source

Réponses:

109

J'ai rencontré le même problème, mais je pense savoir ce qui cause la confusion. Si vous utilisez MySql Query Analyzer, vous pouvez le faire très bien:

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

Cependant, si vous placez cette même requête dans MySql Workbench, une erreur de syntaxe sera générée. Je ne sais pas pourquoi ils seraient différents, mais ils le sont. Pour contourner le problème dans MySql Workbench, vous pouvez réécrire la requête comme ceci:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Tim Gautier
la source
6
En effet, c'est intéressant. Ajout d'une balise MySQL workbench à la question - pour que d'autres puissent trouver que ce problème est lié à MySQL Workbench.
Matt Bannert
1
J'ai utilisé la version 5.2.47 rev 10398 de MySQL Workbench sur Fedora 18 et cela ne pose pas de problème.
GoYun.Info
41

En fin de compte, une procédure stockée était la solution à mon problème. Voici ce qui a aidé:

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
la source
Merci pour les tests ... ça semble intéressant. Malheureusement, je ne comprends pas la dernière phrase. Avez-vous oublié un mot ou deux?
Matt Bannert
41

Ces réponses ne couvrent pas très bien MULTIPLES variables.

L'affectation en ligne dans une procédure stockée entraîne également le renvoi de ces résultats dans l'ensemble de résultats. Cela peut être déroutant. Pour utiliser la syntaxe SELECT ... INTO avec plusieurs variables, procédez comme suit:

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

Le SELECT ne doit renvoyer qu'une seule ligne, d'où LIMIT 1, bien que ce ne soit pas toujours nécessaire.

Garr Godfrey
la source
J'essayais de faire la même chose, les variables sans @ fonctionnaient aussi pour moi. Merci
Anand Rockzz
2
oui, dans une procédure stockée, les variables ne doivent pas nécessairement commencer par @. Mais, il est plus facile de démontrer de cette façon.
Garr Godfrey
21

Vous pouvez également utiliser SET au lieu de DECLARE

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

SELECT myvar;
Somwang Souksavatd
la source
15

Selon les documents MySQL, DECLARE ne fonctionne qu'au début d'un bloc BEGIN ... END comme dans un programme stocké.

Dan U.
la source
Après avoir recherché sur Google 'mysql select inside procedure' et arrivé ici, ne pas avoir les déclarations au début est ce qui a causé l' syntax error, missing ;erreur pour moi.
Miguel Pynto
12

Vous n'avez pas besoin de DÉCLARER une variable dans MySQL. Le type d'une variable est déterminé automatiquement lors de la première affectation d'une valeur. Son type peut être l'un des suivants: entier, décimal, virgule flottante, chaîne binaire ou non binaire ou valeur NULL. Consultez la documentation sur les variables définies par l'utilisateur pour plus d'informations:

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

Vous pouvez utiliser SELECT ... INTO pour affecter des colonnes à une variable:

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

Exemple:

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
la source
1
Hmm, je suis en quelque sorte en difficulté ici .. SELECT 1 INTO @var; renvoie également une erreur de syntaxe. il en va de même: SELECT somevar INTO @var FROM mytable; C'est peut-être un problème DELIMITER?
Matt Bannert
Quelle erreur recevez-vous? Quelle version de MySQL utilisez-vous?
Mike
Code d'erreur: 1064. Vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'INTO @var' à la ligne 3. Version = 5.5.16
Scott Willeke
4

Il est à noter que malgré le fait que vous pouvez SELECT INTOdes variables globales comme:

SELECT ... INTO @XYZ ...

Vous ne pouvez PAS utiliser de FETCH INTOvariables globales comme:

FETCH ... INTO @XYZ

On dirait que ce n'est pas un bug . J'espère que cela sera utile à quelqu'un ...

b.b3rn4rd
la source
3

J'utilise la version 6 (MySQL Workbench Community (GPL) pour Windows version 6.0.9 révision 11421 build 1170) sur Windows Vista. Je n'ai aucun problème avec les options suivantes. Ils l'ont probablement réglé puisque ces gars-là ont eu les problèmes il y a trois ans.

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

Toutes les options ci-dessus me donnent un résultat correct.

Tman
la source
3

Pour ceux qui rencontrent de tels problèmes en ce moment, essayez simplement de mettre un alias pour la table, cela devrait être l'astuce, par exemple:

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

Cela a fonctionné pour moi.

À votre santé.

Emmanuel
la source
1

Vous manquez peut-être le symbole @ avant votre valeur, comme ça select 'test' INTO @myValue;

Salut mec
la source
C'est une variable de session, un sujet différent
Adam F
0

SELECT c1, c2, c3, ... INTO @ v1, @ v2, @ v3, ... FROM nom_table WHERE condition;

Mehrdad Masoumi
la source