mysql:@variable对variable有什么区别?

7xllpg7q  于 2021-06-18  发布在  Mysql
关注(0)|答案(4)|浏览(367)

在我发布的另一个问题中,有人告诉我:

@variable

以及:

variable

在mysql中。他还提到了mssql如何具有批处理作用域,mysql如何具有会话作用域。有人能给我详细解释一下吗?

nlejzf6q

nlejzf6q1#

原则上,我在存储过程中使用userdefinedvariables(前面加@)。这使生活更轻松,特别是当我需要在两个或更多存储过程中使用这些变量时。当我只需要一个存储过程中的变量时,我就使用系统变量(不带前缀@)。
@xybo:我不明白为什么在storedprocess中使用@variables会有风险。你能解释一下“范围”和“界限”吗(对我这个新手来说)?

jvlzgdj9

jvlzgdj92#

在mysql中, @variable 表示用户定义的变量。你可以自己定义。

SET @a = 'test';
SELECT @a;

在存储程序之外 variable ,无 @ ,是一个系统变量,您不能自己定义。
此变量的作用域是整个会话。这意味着,当您与数据库的连接存在时,仍然可以使用该变量。
这与mssql不同,mssql中的变量仅在当前查询批(存储过程、脚本或其他)中可用。它不会在同一会话中的不同批中可用。

jei2mxaa

jei2mxaa3#

mssql要求声明过程中的变量,人们使用@variable语法(declare@text varchar(25)='text')。此外,ms允许在过程中的任何块中进行声明,而mysql则需要在顶部进行所有声明。
虽然命令行不错,但我觉得在mysql的存储过程中使用“set=@variable”是有风险的。没有作用域,变量跨越作用域边界。这类似于javascript中声明的变量没有“var”前缀,后者是全局名称空间,并创建意外的冲突和覆盖。
我希望mysql的优秀人员能够在存储过程中允许在不同的块级别声明@variable。注意@(at符号)。@sign前缀有助于将变量名与表列名分开,因为它们通常是相同的。当然,可以添加一个“v”或“l”前缀,但是@符号是一种方便而简洁的方法,可以让变量名与您可能要从中提取数据的列匹配,而不必对其进行重击。
mysql是存储过程的新手,它们的第一个版本做得很好。这将是一个pleaure看看他们采取的形式在这里,并看到服务器端的语言方面的成熟。

tez616oj

tez616oj4#

mysql有一个用户定义变量的概念。
它们是松散类型的变量,可以在会话中的某个地方初始化,并在会话结束前保留其值。
他们事先准备了一个 @ 签名,像这样: @var 可以使用 SET 语句或查询内部:

SET @var = 1

SELECT @var2 := 2

在mysql中开发存储过程时,可以传递输入参数并声明局部变量:

DELIMITER //

CREATE PROCEDURE prc_test (var INT)
BEGIN
    DECLARE  var2 INT;
    SET var2 = 1;
    SELECT  var2;
END;
//

DELIMITER ;

这些变量没有任何前缀。
过程变量和特定于会话的用户定义变量之间的区别在于,过程变量被重新初始化为 NULL 每次调用过程时,如果会话特定变量不是:

CREATE PROCEDURE prc_test ()
BEGIN
    DECLARE var2 INT DEFAULT 1;
    SET var2 = var2 + 1;
    SET @var2 = @var2 + 1;
    SELECT  var2, @var2;
END;

SET @var2 = 1;

CALL prc_test();

var2  @var2
---   ---
2     2

CALL prc_test();

var2  @var2
---   ---
2     3

CALL prc_test();

var2  @var2
---   ---
2     4

如你所见, var2 (过程变量)在每次调用过程时重新初始化,而 @var2 (会话特定变量)不是。
(除了用户定义的变量外,mysql还有一些预定义的“系统变量”,可以是“全局变量”,比如 @@global.port 或“会话变量”,如 @@session.sql_mode ; 这些“会话变量”与特定于会话的用户定义变量无关。)

相关问题