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,而用户自定义变量则不会。