在一个程序中,我试图从两个不同的表中记录名称和类别,并将它们分成两个单独的变量。出于某种原因,第一个变量与第二个变量的值相同。
所以 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。
答案 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