MySQL DECLARE中的​​SELECT INTO变量会导致语法错误?


94

我想选择一个值到一个变量中。我试图遵循:

DECLARE myvar INT(4);

-立即返回一些语法错误。

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

-返回一个整数

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

-不起作用,也尝试了@myvar

是否可以在存储过程或函数之外使用DECLARE?

也许我只是不了解用户变量的概念……我只是尝试过:

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

...工作原理与预期的一样。但是,如果我一次运行每个查询,我只会得到@var NULL。

Answers:


109

我遇到了同样的问题,但是我想我知道是什么引起了混乱。如果您使用MySql Query Analyzer,则可以这样做:

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

但是,如果将相同的查询放在MySql Workbench中,它将引发语法错误。我不知道为什么他们会与众不同,但事实却有所不同。要变通解决MySql Workbench中的问题,可以重写查询,如下所示:

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

6
确实,这很有趣。在问题中添加了MySQL Workbench标记-因此其他人可能会发现此问题与MySQL Workbench有关。
马特·班纳特

1
我在Fedora 18上使用了MySQL Workbench版本5.2.47 rev 10398,它没有这样的问题。
GoYun.Info

41

最后,存储过程是解决我的问题的方法。这是有帮助的:

DELIMITER //
CREATE PROCEDURE test ()
  BEGIN
  DECLARE myvar DOUBLE;
  SELECT somevalue INTO myvar FROM mytable WHERE uid=1;
  SELECT myvar;
  END
  //

DELIMITER ;

call test ();

测试的Thx ...听起来很有趣。不幸的是我没有得到最后一句话。你忘了一两个字吗?
马特·班纳特

40

这些答案不能很好地涵盖MULTIPLE变量。

在存储过程中进行内联分配会导致将这些结果也发送回结果集中。这可能会造成混乱。要对多个变量使用SELECT ... INTO语法,请执行以下操作:

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

SELECT只能返回1行,即LIMIT 1,尽管这并不总是必需的。


我试图做同样的事情,没有@的变量也对我有用。谢谢
Anand Rockzz '17

2
是的,在存储过程中,变量不必以@开头。但是,更容易证明这种方式。
Garr Godfrey

21

您也可以使用SET代替DECLARE

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

SELECT myvar;

15

根据MySQL文档, DECLARE仅在BEGIN ... END块的开头(如存储程序中)起作用。


谷歌搜索“ mysql select inside procedure”并到达此处后,开头没有声明,这就是导致syntax error, missing ;我出错的原因。
米格尔·皮诺

12

您无需在MySQL中对变量进行DECLARE。变量的类型是在首次分配值时自动确定的。其类型可以是以下之一:整数,十进制,浮点数,二进制或非二进制字符串或NULL值。有关更多信息,请参见用户定义变量文档:

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

您可以使用SELECT ... INTO将列分配给变量:

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

例:

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
嗯,不知何故我在这里遇到了麻烦。SELECT 1 INTO @var; 也返回语法错误。这样做:SELECT somevar INTO @var FROM mytable; 也许这是DELIMITER的问题?
马特·班纳特

您收到什么错误?您正在使用哪个版本的MySQL?
麦克

错误代码:1064。检查与您的MySQL服务器版本相对应的手册,以在第3行的'INTO @var'附近使用正确的语法。Version = 5.5.16
Scott Willeke

4

值得注意的是,尽管您可以使用如下SELECT INTO全局变量:

SELECT ... INTO @XYZ ...

不能使用FETCH INTO全局变量,例如:

FETCH ... INTO @XYZ

看来这不是错误。我希望这对某人有帮助...


3

我在Windows Vista上使用版本6(MySQL Workbench社区(GPL)for Windows版本6.0.9修订版11421内部版本1170)。我没有以下选项的问题。因为这些家伙三年前遇到了问题,所以他们大概解决了。

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

上面的所有选项都给我一个正确的结果。


3

对于那些目前正在运行此类问题的用户,只需尝试为该表放置一个别名,这应该是窍门,例如:

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

它为我工作。

干杯。


1

您可能会在值之前错过@符号,就像这样select 'test' INTO @myValue


那是一个会话变量,不同的主题
Adam F

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.