web-dev-qa-db-fra.com

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

Je voudrais sélectionner 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 entier unique

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 des 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é exactement comme prévu. Mais si je lance chaque requête à la fois, je viens d’obtenir @var NULL.

87
Matt Bannert

En fin de compte, une procédure stockée a été 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 ();
36
Matt Bannert

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 parfaitement:

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

Cependant, si vous posez la 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 suit:

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

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

Effectuer 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 doit renvoyer une seule ligne, d’où LIMIT 1, bien que cela ne soit pas toujours nécessaire.

36
Garr Godfrey

Vous pouvez également utiliser SET au lieu de DECLARE

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

SELECT myvar;
18
Somwang Souksavatd

Per la documentation MySQL DECLARE fonctionne uniquement au début d'un bloc BEGIN ... END comme dans un programme enregistré.

14
Dan U.

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 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)
9
Mike

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

SELECT ... INTO @XYZ ...

Vous pouvez PAS utiliser FETCH INTO variables globales comme:

FETCH ... INTO @XYZ

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

3
b.b3rn4rd

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 ont probablement résolu le problème depuis que ces types 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.

2
Tman

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

1
HiMan

Pour ceux qui exécutent de tels problèmes en ce moment, essayez simplement de mettre un alias pour la table, cela devrait être le truc, par exemple:

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

Cela a fonctionné pour moi.

À votre santé.

1
emmanuel