在我发布的另一个问题中,有人告诉我:
@variable
以及:
variable
在mysql中。他还提到了mssql如何具有批处理作用域,mysql如何具有会话作用域。有人能给我详细解释一下吗?
qcuzuvrc1#
原则上,我在存储过程中使用userdefinedvariables(前面加@)。这使生活更轻松,特别是当我需要在两个或更多存储过程中使用这些变量时。当我只需要一个存储过程中的变量时,我就使用系统变量(不带前缀@)。@xybo:我不明白为什么在storedprocess中使用@variables会有风险。你能解释一下“范围”和“界限”吗(对我这个新手来说)?
2fjabf4q2#
mysql有一个用户定义变量的概念。它们是松散类型的变量,可以在会话中的某个地方初始化,并在会话结束前保留其值。他们事先准备了一个 @ 签名,像这样: @var 可以使用 SET 语句或查询内部:
@
@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 每次调用过程时,如果会话特定变量不是:
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 ; 这些“会话变量”与特定于会话的用户定义变量无关。)
var2
@var2
@@global.port
@@session.sql_mode
hof1towb3#
mssql要求声明过程中的变量,人们使用@variable语法(declare@text varchar(25)='text')。此外,ms允许在过程中的任何块中进行声明,而mysql则需要在顶部进行所有声明。虽然命令行不错,但我觉得在mysql的存储过程中使用“set=@variable”是有风险的。没有作用域,变量跨越作用域边界。这类似于javascript中声明的变量没有“var”前缀,后者是全局名称空间,并创建意外的冲突和覆盖。我希望mysql的优秀人员能够在存储过程中允许在不同的块级别声明@variable。注意@(at符号)。@sign前缀有助于将变量名与表列名分开,因为它们通常是相同的。当然,可以添加一个“v”或“l”前缀,但是@符号是一种方便而简洁的方法,可以让变量名与您可能要从中提取数据的列匹配,而不必对其进行重击。mysql是存储过程的新手,它们的第一个版本做得很好。这将是一个pleaure看看他们采取的形式在这里,并看到服务器端的语言方面的成熟。
frebpwbc4#
在mysql中, @variable 表示用户定义的变量。你可以自己定义。
SET @a = 'test'; SELECT @a;
在存储程序之外 variable ,无 @ ,是一个系统变量,您不能自己定义。此变量的作用域是整个会话。这意味着,当您与数据库的连接存在时,仍然可以使用该变量。这与mssql不同,mssql中的变量仅在当前查询批(存储过程、脚本或其他)中可用。它不会在同一会话中的不同批中可用。
4条答案
按热度按时间qcuzuvrc1#
原则上,我在存储过程中使用userdefinedvariables(前面加@)。这使生活更轻松,特别是当我需要在两个或更多存储过程中使用这些变量时。当我只需要一个存储过程中的变量时,我就使用系统变量(不带前缀@)。
@xybo:我不明白为什么在storedprocess中使用@variables会有风险。你能解释一下“范围”和“界限”吗(对我这个新手来说)?
2fjabf4q2#
mysql有一个用户定义变量的概念。
它们是松散类型的变量,可以在会话中的某个地方初始化,并在会话结束前保留其值。
他们事先准备了一个
@
签名,像这样:@var
可以使用SET
语句或查询内部:在mysql中开发存储过程时,可以传递输入参数并声明局部变量:
这些变量没有任何前缀。
过程变量和特定于会话的用户定义变量之间的区别在于,过程变量被重新初始化为
NULL
每次调用过程时,如果会话特定变量不是:如你所见,
var2
(过程变量)在每次调用过程时重新初始化,而@var2
(会话特定变量)不是。(除了用户定义的变量外,mysql还有一些预定义的“系统变量”,可以是“全局变量”,比如
@@global.port
或“会话变量”,如@@session.sql_mode
; 这些“会话变量”与特定于会话的用户定义变量无关。)hof1towb3#
mssql要求声明过程中的变量,人们使用@variable语法(declare@text varchar(25)='text')。此外,ms允许在过程中的任何块中进行声明,而mysql则需要在顶部进行所有声明。
虽然命令行不错,但我觉得在mysql的存储过程中使用“set=@variable”是有风险的。没有作用域,变量跨越作用域边界。这类似于javascript中声明的变量没有“var”前缀,后者是全局名称空间,并创建意外的冲突和覆盖。
我希望mysql的优秀人员能够在存储过程中允许在不同的块级别声明@variable。注意@(at符号)。@sign前缀有助于将变量名与表列名分开,因为它们通常是相同的。当然,可以添加一个“v”或“l”前缀,但是@符号是一种方便而简洁的方法,可以让变量名与您可能要从中提取数据的列匹配,而不必对其进行重击。
mysql是存储过程的新手,它们的第一个版本做得很好。这将是一个pleaure看看他们采取的形式在这里,并看到服务器端的语言方面的成熟。
frebpwbc4#
在mysql中,
@variable
表示用户定义的变量。你可以自己定义。在存储程序之外
variable
,无@
,是一个系统变量,您不能自己定义。此变量的作用域是整个会话。这意味着,当您与数据库的连接存在时,仍然可以使用该变量。
这与mssql不同,mssql中的变量仅在当前查询批(存储过程、脚本或其他)中可用。它不会在同一会话中的不同批中可用。