MySQL 局部变量

问题描述 投票:0回答:5

我正在尝试为查询定义和初始化 MySQL 变量。

我有以下内容:

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

我在 Netbeans 中使用 MySQL,它告诉我有一个错误。我的错误是什么/哪里?

我该如何解决这个问题?

mysql database set local-variables declare
5个回答
52
投票

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

  • 局部变量不是

    @
    为前缀)是强类型的,作用域为声明它们的存储程序块。请注意,如
    DECLARE
    语法
    :

    下所述

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

  • 用户变量(其中 are

    @
    为前缀)是松散类型的,并且范围仅限于会话。请注意,它们既不需要也不能声明——直接使用它们即可。

因此,如果您正在定义一个存储程序并且实际上确实想要一个“局部变量”,则根据问题中的措辞,您将需要删除

@
字符并确保您的
DECLARE
语句位于你的程序块。否则,要使用“用户变量”,请删除
DECLARE
语句。

此外,您需要将查询括在括号中,以便将其作为子查询执行:

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

否则,你可以使用

SELECT ... INTO
:

SELECT COUNT(*) INTO @countTotal FROM nGrams;

8
投票

试试这个:-

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

4
投票

功能示例:

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 ;

1
投票

根据 DECLARE Syntax

declare
必须位于 begin...end 块内。


-1
投票

您可以使用DECLARE语句设置局部变量,如下所示。 *可以用

DEFAULT
初始化局部变量,不带
DEFAULT
的局部变量的初始值为
NULL
,并且
DECLARE
块可以在存储的BEGIN ... END语句顶部设置程序功能过程事件触发器

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 ;

然后出现如下错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在附近使用的正确语法...

© www.soinside.com 2019 - 2024. All rights reserved.