MySQL本地变量

2g32fytz  于 5个月前  发布在  Mysql
关注(0)|答案(5)|浏览(49)

我正在尝试为查询定义和初始化MySQL变量。
我有以下内容:

DECLARE @countTotal INT;
SET @countTotal = SELECT COUNT(*) FROM nGrams;

字符串
我在Netbeans中使用MySQL,它告诉我有一个错误。我的错误是什么/在哪里?
我该如何解决此问题?

osh3o9ms

osh3o9ms1#

试试这个:

select @countTotal := COUNT(*) from nGrams;

字符串

pkmbmrz7

pkmbmrz72#

功能示例:

DROP FUNCTION IF EXISTS test;

DELIMITER $$
CREATE FUNCTION test(in_number INT) RETURNS INT
    BEGIN
        DECLARE countTotal INT;
        SET countTotal = SELECT COUNT(*) FROM nGrams;
    RETURN countTotal + in_number;
END $$
DELIMITER ;

字符串

lg40wkob

lg40wkob3#

根据DECLARE Syntaxdeclare必须位于开始.结束块中。

n3schb8v

n3schb8v4#

您可以使用DECLARE statement设置局部变量,如下所示:

DELIMITER $$

CREATE FUNCTION my_func() RETURNS INT 
DETERMINISTIC
BEGIN
  DECLARE v1, v2 INT DEFAULT 2;       -- v1 and v2 are 2.
  DECLARE v3, v4 INT DEFAULT v1 + v2; -- v3 and v4 are 4.
  DECLARE result INT;                 -- result is NULL.
  SELECT v3 + v4 INTO result;         -- result is 8. 
  RETURN result;                      -- 8 is returned.
END$$ 

DELIMITER ;

字符串

然后,返回8,如下所示:

mysql> SELECT my_func();
+-----------+
| my_func() |
+-----------+
|         8 |
+-----------+


请注意,如果DECLARE块没有在存储程序中的BEGIN ... END语句的顶部设置,如下所示:

DELIMITER $$

CREATE FUNCTION my_func() RETURNS INT 
DETERMINISTIC
BEGIN
  SELECT 2 + 3;                       -- Because of this
  DECLARE v1, v2 INT DEFAULT 2;       -- Not the top
  DECLARE v3, v4 INT DEFAULT v1 + v2; -- Not the top
  DECLARE result INT;                 -- Not the top
  SELECT v3 + v4 INTO result;
  RETURN result;
END$$ 

DELIMITER ;


或者:

DELIMITER $$

CREATE FUNCTION my_func() RETURNS INT 
DETERMINISTIC
BEGIN
  DECLARE v1, v2 INT DEFAULT 2;
  DECLARE v3, v4 INT DEFAULT v1 + v2;
  SELECT 2 + 3;       -- Because of this
  DECLARE result INT; -- Not the top
  SELECT v3 + v4 INTO result;
  RETURN result;
END$$ 

DELIMITER ;


然后,下面是错误:
错误1064(42000):您的SQL语法中有一个错误;请检查与您的MySQL服务器版本对应的手册,以获得正确的语法来使用。

lrl1mhuk

lrl1mhuk5#

MySQL有两种不同类型的变量:

局部变量 没有 * 前缀@)是强类型的,作用域是声明它们的存储程序块。请注意,如DECLARE Syntax下所述:

DECLARE只允许在BEGIN ... END复合语句中使用,并且必须位于其开头,在任何其他语句之前。

  • user variables(* are* 前缀为@)是松散类型的,作用域为会话。请注意,它们既不需要也不能被替换-直接使用它们。

因此,如果你正在定义一个存储程序,并且确实想要一个“局部变量”,根据你的问题中的措辞,你需要删除@字符,并确保你的DECLARE语句位于程序块的开头。否则,要使用“用户变量”,请删除DECLARE语句。
此外,您需要将查询括在括号中,以便将其作为子查询执行:

SET @countTotal = (SELECT COUNT(*) FROM nGrams);

字符串
或者,你可以使用SELECT ... INTO

SELECT COUNT(*) INTO @countTotal FROM nGrams;

相关问题