two - SELECT INTO Variable en MySQL DECLARE causa un error de sintaxis?
set variable mysql (10)
Al final, un procedimiento almacenado fue la solución para 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 ();
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 usar DECLARE fuera de procedimientos o funciones almacenados?
Tal vez no entiendo el concepto de variables de usuario ... Acabo de probar:
SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;
... que funcionó exactamente como se suponía. Pero si ejecuto cada consulta a la vez, obtengo @var NULL.
Es posible que te pierdas el símbolo @ antes de tu valor, así que select ''test'' INTO @myValue
;
Estas respuestas no cubren muy bien variables MÚLTIPLES.
Hacer la asignación en línea en un procedimiento almacenado hace que esos resultados TAMBIÉN se envíen nuevamente en el conjunto de resultados. Eso puede ser confuso. Para usar la sintaxis SELECT ... INTO con múltiples variables:
SELECT a, b INTO @a, @b FROM mytable LIMIT 1;
El SELECT debe devolver solo 1 fila, por lo tanto LIMIT 1, aunque eso no siempre es necesario.
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 problemas con las siguientes opciones. Probablemente lo solucionaron 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.
Me encontré con este mismo problema, pero creo que sé lo que 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, lanzará un error de sintaxis. No sé por qué serían diferentes, pero lo son. Para evitar el problema en MySql Workbench, puede volver a escribir la consulta de esta manera:
SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
No necesita DECLARAR una variable en MySQL. El tipo de una variable se determina automáticamente cuando se le asigna un valor por primera vez. Su tipo puede ser uno de: enteros, decimales, de coma flotante, cadenas binarias o no binarias, o valores 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)
Para aquellos que se ejecutan en estos temas en este momento, solo intentan 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í
Aclamaciones.
Según los documentos de MySQL, DECLARE funciona solo al comienzo de un bloque BEGIN ... END como en un programa almacenado.
También puede usar SET en lugar de DECLARAR
SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);
SELECT myvar;
Vale la pena señalar que a pesar del hecho de que puede SELECT INTO
variables globales como:
SELECT ... INTO @XYZ ...
NO puede usar FETCH INTO
variables globales como:
FETCH ... INTO @XYZ
Parece que no es un bug . Espero que sea útil para alguien ...