MySQL中的用户自定义变量与局部变量?


用户自定义变量也称为会话特定变量。它是一种松散类型的变量,可以在会话中的某个位置初始化,并在会话结束之前包含用户自定义变量的值。

用户自定义变量以符号@为前缀。例如

@anyVariableName;

您可以通过两种方法初始化用户自定义变量。您可以使用SET命令或使用SELECT查询。第一种方法如下:

SET @anyVariableName=anyValue;

第二种方法如下:

SELECT @anyVariableName :=anyValue;

如果您在SELECT查询中不使用冒号(:),则它会将其评估为表达式。结果将为真或假。

mysql> select @m=10;

以下是输出:

+-------+
| @m=10 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

局部变量可用于存储过程、函数等。它与DECLARE关键字一起使用。不需要像用户自定义变量那样的@前缀。

局部变量的语法如下。

DECLARE yourVariableName dataType;

注意:局部变量和用户自定义变量之间的主要区别在于,每次调用存储过程时,局部变量都会重新初始化为NULL值,而会话特定变量或用户自定义变量不会重新初始化为NULL。一个用户设置的用户自定义变量无法被其他用户看到。给定用户的任何会话变量在用户退出时都会自动销毁。

以下是带有存储过程的会话特定变量和局部变量的演示。创建包含局部变量和用户自定义变量的存储过程的查询如下:

mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_LocalAndUserDefinedVariableDemo()
   -> BEGIN
   -> DECLARE localVariable int default 10;
   -> SET localVariable=localVariable+10;  
   -> SET @userVariable=@userVariable+10;
   -> SELECT localVariable;
   -> SELECT @userVariable;
   -> END;
   -> //
Query OK, 0 rows affected (0.39 sec)
mysql> DELIMITER ;

现在设置用户自定义变量的值。查询如下:

mysql> SET @userVariable=10;
Query OK, 0 rows affected (0.00 sec)

现在调用存储过程。在第一次调用中,用户自定义变量将为10+10=20,而局部变量将为10+10=20。

使用call命令调用存储过程

mysql> CALL sp_LocalAndUserDefinedVariableDemo();

以下是输出:

+---------------+
| localVariable |
+---------------+
|            20 |
+---------------+
1 row in set (0.32 sec)
+---------------+
| @userVariable |
+---------------+
|            20 |
+---------------+
1 row in set (0.34 sec)
Query OK, 0 rows affected (0.36 sec)

在第二次调用中,用户自定义变量将保持值为20,并加上10,例如20+10=30,而局部变量将再次初始化为10,并加上10,例如10+10=20。

调用存储过程并检查示例输出

mysql> CALL sp_LocalAndUserDefinedVariableDemo();

以下是输出:

+---------------+
| localVariable |
+---------------+
|            20 |
+---------------+
1 row in set (0.00 sec)
+---------------+
| @userVariable |
+---------------+
|            30 |
+---------------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.02 sec)

在第三次调用中,用户自定义变量将保持值为30,并加上10,例如30+10=40,而局部变量将再次初始化为10,并加上10,例如10+10=20。

现在您可以说,在每次过程调用中,局部变量都将使用某个值重新初始化,该值可能是NULL或其他值,在我的例子中,我提供了默认值10。这意味着它在每次过程调用中都将局部变量设置为值10,而用户自定义变量则不会。

更新于:2019年7月30日

1K+ 浏览量

启动您的职业生涯

通过完成课程获得认证

开始学习
广告