SELECT INTO Variável no MySQL DECLARE causa erro de sintaxe?

94

Eu gostaria de SELECIONAR um único valor em uma variável. Eu tentei seguir:

DECLARE myvar INT(4);

- retorna imediatamente algum erro de sintaxe.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- retorna um único inteiro

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- não funciona, também tentei @myvar

É possível usar DECLARE fora de stored procedures ou funções?

Talvez eu simplesmente não entenda o conceito de variáveis ​​de usuário ... Eu apenas tentei:

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

... que funcionou exatamente como deveria. Mas se eu executar cada consulta por vez, obtenho apenas @var NULL.

Matt Bannert
fonte

Respostas:

109

Encontrei o mesmo problema, mas acho que sei o que está causando a confusão. Se você usa o MySql Query Analyzer, pode fazer isso perfeitamente:

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

No entanto, se você colocar a mesma consulta no MySql Workbench, ocorrerá um erro de sintaxe. Não sei por que seriam diferentes, mas são. Para contornar o problema no MySql Workbench, você pode reescrever a consulta assim:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Tim Gautier
fonte
6
Na verdade, isso é interessante. Adicionada uma tag de workbench MySQL à pergunta - para que outros possam descobrir que esse problema está relacionado ao MySQL Workbench.
Matt Bannert,
1
Eu usei o MySQL workbench versão 5.2.47 rev 10398 no Fedora 18 e não há esse problema com ele.
GoYun.Info
41

No final, um procedimento armazenado foi a solução para meu problema. Aqui está o que ajudou:

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
fonte
Obrigado pelo teste ... parece interessante. Infelizmente não entendi a última frase. Você esqueceu uma ou duas palavras?
Matt Bannert
40

Essas respostas não cobrem muito bem as variáveis ​​MÚLTIPLAS.

Fazer a atribuição inline em um procedimento armazenado faz com que esses resultados TAMBÉM sejam enviados de volta no conjunto de resultados. Isso pode ser confuso. Para usar a sintaxe SELECT ... INTO com várias variáveis, você faz:

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

O SELECT deve retornar apenas 1 linha, portanto LIMIT 1, embora isso nem sempre seja necessário.

Garr Godfrey
fonte
Eu estava tentando fazer o mesmo, variáveis ​​sem @ também funcionaram para mim. Obrigado
Anand Rockzz
2
sim, em um procedimento armazenado, as variáveis ​​não precisam começar com @. Mas, é mais fácil demonstrar dessa forma.
Garr Godfrey
21

Você também pode usar SET em vez de DECLARE

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

SELECT myvar;
Somwang Souksavatd
fonte
15

De acordo com a documentação do MySQL, DECLARE funciona apenas no início de um bloco BEGIN ... END como em um programa armazenado.

Dan U.
fonte
Após pesquisar por 'mysql select inside procedure' e chegar aqui, não ter as declarações no início é o que estava causando o syntax error, missing ;erro para mim.
Miguel Pynto
12

Você não precisa DECLARAR uma variável no MySQL. O tipo de uma variável é determinado automaticamente quando um valor é atribuído a ela pela primeira vez. Seu tipo pode ser: inteiro, decimal, ponto flutuante, string binária ou não-binária ou valor NULL. Consulte a documentação das variáveis ​​definidas pelo usuário para obter mais informações:

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

Você pode usar SELECT ... INTO para atribuir colunas a uma variável:

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

Exemplo:

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
fonte
1
Hmm, de alguma forma estou com problemas aqui .. SELECT 1 INTO @var; retorna um erro de sintaxe também. o mesmo acontece: SELECT somevar INTO @var FROM mytable; Talvez seja um problema de DELIMITER?
Matt Bannert
Que erro você está recebendo? Qual versão do MySQL você está usando?
Mike
Código de erro: 1064. Você tem um erro na sintaxe SQL; verifique o manual que corresponde à versão do seu servidor MySQL para obter a sintaxe correta para usar próximo a 'INTO @var' na linha 3. Versão = 5.5.16
Scott Willeke
4

É importante notar que apesar do fato de você poder SELECT INTOvariáveis ​​globais como:

SELECT ... INTO @XYZ ...

Você NÃO pode usar FETCH INTOvariáveis ​​globais como:

FETCH ... INTO @XYZ

Parece que não é um bug . Espero que seja útil para alguém ...

b.b3rn4rd
fonte
3

Estou usando a versão 6 (MySQL Workbench Community (GPL) para Windows versão 6.0.9 revisão 11421 build 1170) no Windows Vista. Não tenho problemas com as seguintes opções. Provavelmente eles consertaram, já que esses caras tiveram os problemas três anos atrás.

/* 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 as opções acima me dão um resultado correto.

Tman
fonte
3

Para aqueles que estão executando esses problemas agora, apenas tente colocar um apelido para a tabela, este deve ser o truque, por exemplo:

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

Funcionou para mim

Felicidades.

emmanuel
fonte
1

Você pode perder o símbolo @ antes do seu valor, assim select 'test' INTO @myValue;

Oi cara
fonte
Essa é uma variável de sessão, tópico diferente
Adam F
0

SELECT c1, c2, c3, ... INTO @ v1, @ v2, @ v3, ... FROM nome_tabela WHERE condição;

Mehrdad Masoumi
fonte