Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据@或DECLARE,作用不同的过程变量_Mysql_Mysql Workbench - Fatal编程技术网

Mysql 根据@或DECLARE,作用不同的过程变量

Mysql 根据@或DECLARE,作用不同的过程变量,mysql,mysql-workbench,Mysql,Mysql Workbench,在一个过程中,我试图从两个不同的表中记录名称和类别,并将它们放入两个单独的变量中。出于某种原因,第一个变量得到的值与第二个变量的值相同 所以TitleName将与CategoryName具有相同的值,但它们完全不相关 CREATE PROCEDURE `TestProc` () BEGIN DECLARE TitleName TINYTEXT; DECLARE CategoryName TINYTEXT; SELECT name FROM titles_table WHERE titles_

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

所以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
输出:我的类别,我的类别 ..... 应该是:我的头衔,我的类别

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

或者,如果删除第二个选择行选择类别,则TitleName将保留正确的值

以下步骤可以编辑,但为什么

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

我的问题是:当我使用@符号时,它为什么起作用


我已经使用DECLARE声明了变量,所以在本例中,@和DECLARE有什么区别?我希望变量作用域在结束时结束,这就是我使用DECLARE的原因。你知道为什么这会给我不同的结果吗?我正在使用MySQL WorkBench。

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

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

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

DECLARE TitleName TINYTEXT;
...
你应使用:

DECLARE v_TitleName TINYTEXT;

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

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

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

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

DECLARE TitleName TINYTEXT;
...
你应使用:

DECLARE v_TitleName TINYTEXT;

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

问题似乎出在我的MySQL版本上,也许是一个bug。 我升级到了最新版本,现在可以正常工作了

我的版本是:5.7.10
我升级到:5.7.17

问题似乎出在我的MySQL版本上,可能是一个bug。 我升级到了最新版本,现在可以正常工作了

我的版本是:5.7.10
我升级到:5.7.17

我的第一个过程示例中的问题是,变量都获得相同的值,即使它们都从两个不同的表中获得不同值的信息。但当我添加@时,它的效果与预期一样。不知道为什么。DECLARE变量应该在BEGIN和END中保持其值,因此我不想使用@,因为我希望变量到达END后即结束。我的第一个过程示例中的问题是,变量都获得相同的值,即使它们都从两个不同的表中获取信息,并且具有不同的值。但当我添加@时,它的效果与预期一样。不知道为什么。DECLARE变量应该在BEGIN和END中保持它们的值,所以我不想使用@,因为我希望变量到达END后完成。