我正在尝试为查询定义和初始化 MySQL 变量。
我有以下内容:
DECLARE @countTotal INT;
SET @countTotal = SELECT COUNT(*) FROM nGrams;
我在 Netbeans 中使用 MySQL,它告诉我有一个错误。我的错误是什么/哪里?
我该如何解决这个问题?
MySQL 有两种不同类型的变量:
局部变量(不是以
@
为前缀)是强类型的,作用域为声明它们的存储程序块。请注意,如DECLARE
语法:下所述
只能在DECLARE
复合语句中使用,并且必须位于其开头、任何其他语句之前。BEGIN ... END
用户变量(其中 are 以
@
为前缀)是松散类型的,并且范围仅限于会话。请注意,它们既不需要也不能声明——直接使用它们即可。
因此,如果您正在定义一个存储程序并且实际上确实想要一个“局部变量”,则根据问题中的措辞,您将需要删除
@
字符并确保您的 DECLARE
语句位于你的程序块。否则,要使用“用户变量”,请删除 DECLARE
语句。
此外,您需要将查询括在括号中,以便将其作为子查询执行:
SET @countTotal = (SELECT COUNT(*) FROM nGrams);
SELECT ... INTO
:
SELECT COUNT(*) INTO @countTotal FROM nGrams;
试试这个:-
select @countTotal := COUNT(*) from nGrams;
功能示例:
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 ;
根据 DECLARE Syntax,
declare
必须位于 begin...end 块内。
您可以使用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 服务器版本相对应的手册,了解在附近使用的正确语法...