SELECT INTO Variable en MySQL DECLARAR causa error de sintaxis?

94

Me gustaría SELECCIONAR un solo valor en una variable. Intenté seguir:

DECLARE myvar INT(4);

- devuelve inmediatamente algún error de sintaxis.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- devuelve un solo entero

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- no funciona, también probé @myvar

¿Es posible utilizar DECLARE fuera de los procedimientos o funciones almacenados?

Tal vez simplemente no entiendo el concepto de variables de usuario ... Solo intenté:

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

... que funcionó como se suponía. Pero si ejecuto cada consulta a la vez, obtengo @var NULL.

Matt Bannert
fuente

Respuestas:

109

Me encontré con el mismo problema, pero creo que sé qué está causando la confusión. Si usa MySql Query Analyzer, puede hacerlo bien:

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

Sin embargo, si coloca esa misma consulta en MySql Workbench, arrojará un error de sintaxis. No sé por qué serían diferentes, pero lo son. Para solucionar el problema en MySql Workbench, puede reescribir la consulta de esta manera:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Tim Gautier
fuente
6
De hecho, eso es interesante. Se agregó una etiqueta de MySQL Workbench a la pregunta, por lo que otros podrían encontrar que este problema está relacionado con MySQL Workbench.
Matt Bannert
1
Usé MySQL workbench versión 5.2.47 rev 10398 en Fedora 18 y no hay tal problema con él.
GoYun.Info
la segunda solución :=quedará obsoleta. ¡Así que prefiere usar el SELECT ... INTO!
Meloman
41

Al final, un procedimiento almacenado fue la solución a mi problema. Esto es lo que ayudó:

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
fuente
Gracias por las pruebas ... suena interesante. Lamentablemente no recibo la última frase. ¿Olvidaste una palabra o dos?
Matt Bannert
41

Estas respuestas no cubren muy bien MÚLTIPLES variables.

Al realizar la asignación en línea en un procedimiento almacenado, esos resultados TAMBIÉN se envían de vuelta en el conjunto de resultados. Eso puede resultar confuso. Para usar la sintaxis SELECT ... INTO con múltiples variables, debe:

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

SELECT debe devolver solo 1 fila, por lo tanto, LIMIT 1, aunque eso no siempre es necesario.

Garr Godfrey
fuente
Estaba tratando de hacer lo mismo, las variables sin @ también me funcionaron. Gracias
Anand Rockzz
2
sí, en un procedimiento almacenado, las variables no tienen que empezar con @. Pero es más fácil demostrarlo de esa manera.
Garr Godfrey
22

También puede usar SET en lugar de DECLARE

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

SELECT myvar;
Somwang Souksavatd
fuente
15

Según los documentos de MySQL, DECLARE funciona solo al comienzo de un bloque BEGIN ... END como en un programa almacenado.

Dan U.
fuente
Después de buscar en Google 'mysql select inside procedure' y llegar aquí, no tener las declaraciones al principio es lo que me estaba causando el syntax error, missing ;error.
Miguel Pynto
12

No es necesario DECLARAR una variable en MySQL. El tipo de variable se determina automáticamente cuando se le asigna un valor por primera vez. Su tipo puede ser uno de los siguientes: entero, decimal, punto flotante, cadena binaria o no binaria, o valor NULL. Consulte la documentación de Variables definidas por el usuario para obtener más información:

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

Puede usar SELECT ... INTO para asignar columnas a una variable:

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

Ejemplo:

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)
Miguel
fuente
1
Hmm, de alguna manera estoy en problemas aquí .. SELECCIONE 1 EN @var; también devuelve un error de sintaxis. también lo hace: SELECT somevar INTO @var FROM mytable; ¿Quizás es un problema DELIMITER?
Matt Bannert
¿Qué error estás recibiendo? ¿Qué versión de MySQL estás usando?
Mike
Código de error: 1064. Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de 'INTO @var' en la línea 3. Versión = 5.5.16
Scott Willeke
4

Vale la pena señalar que a pesar de que puede tener SELECT INTOvariables globales como:

SELECT ... INTO @XYZ ...

NO puede usar FETCH INTOvariables globales como:

FETCH ... INTO @XYZ

Parece que no es un error . Espero que sea de ayuda para alguien ...

b.b3rn4rd
fuente
3

Estoy usando la versión 6 (MySQL Workbench Community (GPL) para Windows versión 6.0.9 revisión 11421 compilación 1170) en Windows Vista. No tengo ningún problema con las siguientes opciones. Probablemente lo arreglaron ya que estos tipos tuvieron los problemas hace tres años.

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

Todas las opciones anteriores me dan un resultado correcto.

Tman
fuente
3

Para aquellos que tienen estos problemas en este momento, solo intente poner un alias para la tabla, este debería ser el truco, por ejemplo:

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

Funcionó para mí.

Salud.

emmanuel
fuente
1

Tal vez pierda el símbolo @ antes de su valor, así select 'test' INTO @myValue;

Hola hombre
fuente
Esa es una variable de sesión, un tema diferente
Adam F
0

SELECCIONE c1, c2, c3, ... INTO @ v1, @ v2, @ v3, ... FROM table_name WHERE condición;

Mehrdad Masoumi
fuente