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.
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 ();
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;
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.
Vous pouvez également utiliser SET au lieu de DECLARE
SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);
SELECT myvar;
Per la documentation MySQL DECLARE fonctionne uniquement au début d'un bloc BEGIN ... END comme dans un programme enregistré.
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)
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 ...
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.
Vous manquez peut-être le symbole @ avant votre valeur, comme cela select 'test' INTO @myValue
;
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é.