gpt4 book ai didi

mysql - 过程变量根据 @ 或 DECLARE 行为不同

转载 作者:行者123 更新时间:2023-11-30 22:06:16 24 4
gpt4 key购买 nike

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

因此 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

输出:“我的类别”、“我的类别”..... 应该是:“我的标题”、“我的分类”

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

如果我删除第二个 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。

最佳答案

DECLARE 变量和@-variables 之间的区别在于 DECLARE 变量是局部变量(在 block 内可见),而 @-variables 是 session 变量(它们在整个连接期间保持状态)。

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

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

DECLARE TitleName TINYTEXT;
...

你应该使用:

DECLARE v_TitleName TINYTEXT;

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

关于mysql - 过程变量根据 @ 或 DECLARE 行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41652262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com