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

Mat*_*ert 87 mysql select declare mysql-workbench

我想将单个值选择为变量.我试着跟随:

DECLARE myvar INT(4);
Run Code Online (Sandbox Code Playgroud)

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

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;
Run Code Online (Sandbox Code Playgroud)

- 返回一个整数

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;
Run Code Online (Sandbox Code Playgroud)

- 不起作用,也试过@myvar

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

也许我只是没有得到用户变量的概念......我只是尝试过:

SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;
Run Code Online (Sandbox Code Playgroud)

...就像它应该的那样工作.但是,如果我一次运行每个查询,我只得到@var NULL.

Tim*_*ier 103

我遇到了同样的问题,但我想我知道是什么导致了混乱.如果您使用MySql查询分析器,您可以这样做:

SELECT myvalue 
INTO @myvar 
FROM mytable 
WHERE anothervalue = 1;
Run Code Online (Sandbox Code Playgroud)

但是,如果在MySql Workbench中放置相同的查询,则会引发语法错误.我不知道为什么他们会有所不同,但他们是.要解决MySql Workbench中的问题,可以像这样重写查询:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
Run Code Online (Sandbox Code Playgroud)

  • 确实这很有趣.在问题中添加了MySQL工作台标记 - 因此其他人可能会发现此问题与MySQL Workbench有关. (5认同)

Gar*_*rey 38

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

在存储过程中执行内联分配会导致这些结果也会在结果集中发回.这可能令人困惑.要使用带有多个变量的SELECT ... INTO语法,您可以:

SELECT a, b INTO @a, @b FROM mytable LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

SELECT必须只返回1行,因此LIMIT 1,尽管并不总是必需的.

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

Mat*_*ert 37

最后,存储过程是我的问题的解决方案.这有助于:

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

DELIMITER ;

call test ();
Run Code Online (Sandbox Code Playgroud)

  • 遇到这个问题之后,似乎这个答案解决了这个问题,但它没有试图描述原因.正如其他人所说,DECLARE的变量不是必需的.'SELECT somevalue INTO @myvar'也可以.我在测试中发现的是,由于在存储过程中使用了'SELECT x INTO y'语句,因此不会抛出语法错误. (2认同)

Som*_*atd 19

您也可以使用SET而不是DECLARE

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

SELECT myvar;
Run Code Online (Sandbox Code Playgroud)


Dan*_* U. 14

Per the MySQL docs DECLARE works only at the start of a BEGIN...END block as in a stored program.


Mik*_*ike 9

您不需要在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/en/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)
Run Code Online (Sandbox Code Playgroud)


小智 5

I am using version 6 (MySQL Workbench Community (GPL) for Windows version 6.0.9 revision 11421 build 1170) on Windows Vista. I have no problem with the following options. Probably they fixed it since these guys got the problems three years ago.

/* 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';
Run Code Online (Sandbox Code Playgroud)

All option above give me a correct result.