MySQL DECLARE 中的 SELECT INTO 变量导致语法错误?
Posted
技术标签:
【中文标题】MySQL DECLARE 中的 SELECT INTO 变量导致语法错误?【英文标题】:SELECT INTO Variable in MySQL DECLARE causes syntax error? 【发布时间】:2011-03-05 17:54:18 【问题描述】:我想将单个值选择到变量中。我试图关注:
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。
【问题讨论】:
【参考方案1】:最后,存储过程是我的问题的解决方案。
这是有帮助的:
DELIMITER //
CREATE PROCEDURE test ()
BEGIN
DECLARE myvar DOUBLE;
SELECT somevalue INTO myvar FROM mytable WHERE uid = 1;
SELECT myvar;
END//
DELIMITER ;
call test();
【讨论】:
感谢测试...听起来很有趣。不幸的是,我没有得到最后一句话。你忘了一两个字吗?【参考方案2】:我遇到了同样的问题,但我想我知道是什么导致了混乱。如果你使用 mysql Query Analyzer,你可以这样做:
SELECT myvalue
INTO @myvar
FROM mytable
WHERE anothervalue = 1;
但是,如果您将相同的查询放在 MySQL Workbench 中,则会引发语法错误。我不知道为什么它们会有所不同,但确实如此。
要解决 MySQL Workbench 中的问题,您可以像这样重写查询:
SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
【讨论】:
确实很有趣。在问题中添加了 MySQL 工作台标签——因此其他人可能会发现此问题与 MySQL 工作台有关。 我在 Fedora 18 上使用了 MySQL Workbench 版本 5.2.47 rev 10398,没有这个问题。 第二个解决方案:=
将被弃用。所以更喜欢使用SELECT ... INTO
!【参考方案3】:
选择 c1, c2, c3, ... 进入 @v1,@v2,@v3,... 从 表名 在哪里 条件;
【讨论】:
【参考方案4】:对于那些现在遇到此类问题的人,只需尝试为表添加别名,这应该是诀窍,例如:
SELECT myvalue
INTO myvar
FROM mytable x
WHERE x.anothervalue = 1;
它对我有用。
干杯。
【讨论】:
【参考方案5】:你可能会错过你的值之前的@符号,比如select 'test' INTO @myValue
;
【讨论】:
这是一个会话变量,不同的主题【参考方案6】:您也可以使用 SET 代替 DECLARE
SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);
SELECT myvar;
【讨论】:
这行得通,语法简洁,我喜欢【参考方案7】:这些答案不能很好地涵盖多个变量。
在存储过程中执行内联赋值会导致这些结果也被发送回结果集中。这可能会令人困惑。要将 SELECT...INTO 语法与多个变量一起使用:
SELECT a, b INTO @a, @b FROM mytable LIMIT 1;
SELECT 必须只返回 1 行,因此 LIMIT 1,尽管这并不总是必要的。
【讨论】:
我也在尝试做同样的事情,没有 @ 的变量也对我有用。谢谢 是的,在存储过程中,变量不必以@开头。但是,以这种方式演示更容易。【参考方案8】:我在 Windows Vista 上使用版本 6(适用于 Windows 版本 6.0.9 修订版 11421 build 1170 的 MySQL Workbench Community (GPL))。我对以下选项没有任何问题。可能他们修复了它,因为这些人三年前遇到了问题。
/* 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';
以上所有选项都给我一个正确的结果。
【讨论】:
【参考方案9】:值得注意的是,尽管你可以SELECT INTO
全局变量如:
SELECT ... INTO @XYZ ...
您可以不使用 FETCH INTO
全局变量,例如:
FETCH ... INTO @XYZ
看起来它不是bug。我希望它对某人有所帮助......
【讨论】:
【参考方案10】:您不需要在 MySQL 中声明变量。变量的类型在第一次被赋值时自动确定。它的类型可以是以下之一:整数、十进制、浮点、二进制或非二进制字符串,或 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)
【讨论】:
嗯,不知何故我在这里遇到了麻烦.. SELECT 1 INTO @var;也返回语法错误。也是如此: SELECT somevar INTO @var FROM mytable;也许这是一个 DELIMITER 问题? 您收到什么错误?你用的是什么版本的 MySQL? 错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“INTO @var”附近使用正确的语法。版本=5.5.16【参考方案11】:根据the MySQL docs DECLARE 仅在 BEGIN...END 块的开头起作用,就像在存储程序中一样。
【讨论】:
在谷歌搜索“mysql select inside procedure”并到达此处后,开始时没有声明是导致我出现syntax error, missing ;
错误的原因。以上是关于MySQL DECLARE 中的 SELECT INTO 变量导致语法错误?的主要内容,如果未能解决你的问题,请参考以下文章