过程变量根据@或DECLARE的不同而不同

时间:2017-01-14 16:27:04

标签: mysql mysql-workbench

在一个程序中,我试图从两个不同的表中记录名称和类别,并将它们分成两个单独的变量。出于某种原因,第一个变量与第二个变量的值相同。

所以 TitleName CategoryName 具有相同的值,但它们完全不相关。

CREATE PROCEDURE `TestProc` () BEGIN

DECLARE TitleName TINYTEXT;
DECLARE CategoryName TINYTEXT;

SELECT name FROM titles_table WHERE titles_table.id = 20 INTO TitleName;
SELECT category FROM categories_table WHERE categories_table.id = 3 INTO CategoryName;

SELECT TitleName, CategoryName;

END

输出:"我的类别","我的类别" .....应该是:"我的标题","我的类别"

但是:如果我在变量名称前添加@符号,它会按预期工作,并且两个变量都会获得唯一值。

OR 如果删除第二个SELECT行(SELECT类别),则TitleName会保留正确的值。

以下程序编辑有效,但为什么?:

CREATE PROCEDURE `TestProc` () BEGIN

DECLARE TitleName TINYTEXT;
DECLARE CategoryName TINYTEXT;

SELECT name FROM titles_table WHERE titles_table.id = 20 INTO @TitleName;
SELECT category FROM categories_table WHERE categories_table.id = 3 INTO @CategoryName;

SELECT @TitleName, @CategoryName;

END

正确输出:"我的标题","我的类别"

我的问题是:为什么我使用@符号时会起作用?

我已经使用DECLARE声明了变量,所以在这种情况下,@和DECLARE会有什么区别?我希望变量范围在达到END时完成,这就是我使用DECLARE的原因。任何想法为什么这给我不同的结果?我正在使用MySQL WorkBench。

2 个答案:

答案 0 :(得分:0)

DECLARE变量和@变量之间的区别在于DECLARE变量是局部变量(在块内可见),而@变量是会话变量(它们在整个连接中保持状态)。

如果使用会话变量并且您调用另一个使用相同变量的过程,则更改在调用过程中也有效)。另一个区别是,使用DECLARE可以定义特定的数据类型。

在过程中使用变量时,应使用局部变量(声明)以避免冲突。在变量名中使用前缀/后缀以确保变量名称不与列名冲突。而不是:

DECLARE TitleName TINYTEXT;
...

您应该使用:

DECLARE v_TitleName TINYTEXT;

SELECT name INTO v_TitleName
FROM titles_table 
WHERE titles_table.id = 20;

答案 1 :(得分:0)

问题似乎与我的MySQL版本(可能是一个bug)有关。 我升级到此日期的最新版本,现在它正常工作。

我遇到的问题是:5.7.10 我升级到:5.7.17

相关问题