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.

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;

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 ();

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.


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;

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.


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)

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 ...


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.


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.


1

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


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;

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.