在MySQL 8.0的存储过程开发中,局部变量是存储过程内部用于临时存储数据的变量,作用范围仅限于当前存储过程,和会话变量、用户变量有明显区别。正确定义局部变量是编写复杂存储过程的基础,而DECLARE关键词就是声明局部变量的核心语法。

DECLARE关键词的基本语法
在MySQL 8.0的存储过程中,局部变量必须使用DECLARE关键词在存储过程的开头部分声明,且声明语句必须放在BEGIN关键字之后,其他执行语句之前。基本语法格式如下:
DECLARE 变量名 数据类型 [DEFAULT 默认值];
其中变量名需要符合MySQL的标识符命名规则,数据类型可以是MySQL支持的所有数据类型,比如INT、VARCHAR、DATE等,DEFAULT子句是可选的,用于给变量设置初始默认值。
DEFAULT值的使用规则
如果在声明局部变量时没有指定DEFAULT值,变量的初始值会默认为NULL。如果需要通过DEFAULT给变量设置初始值,默认值需要和变量的数据类型匹配,否则会抛出语法错误。以下是几个合法的声明示例:
-- 声明整型变量,默认值为10 DECLARE user_count INT DEFAULT 10; -- 声明字符串变量,默认值为空字符串 DECLARE user_name VARCHAR(50) DEFAULT ''; -- 声明日期变量,默认值为当前日期 DECLARE create_date DATE DEFAULT CURDATE(); -- 声明变量不设置默认值,初始为NULL DECLARE total_amount DECIMAL(10,2);
完整存储过程示例
下面通过一个完整的存储过程示例,演示局部变量的声明、DEFAULT值设置以及变量的使用流程。这个存储过程的作用是统计指定用户ID的订单总数量,并将结果通过输出参数返回:
DELIMITER //
CREATE PROCEDURE count_user_orders(
IN input_user_id INT,
OUT order_total INT
)
BEGIN
-- 声明局部变量,设置默认值为0
DECLARE temp_count INT DEFAULT 0;
-- 查询订单数量并赋值给局部变量
SELECT COUNT(*) INTO temp_count FROM orders WHERE user_id = input_user_id;
-- 将局部变量的值赋给输出参数
SET order_total = temp_count;
END //
DELIMITER ;
调用这个存储过程的代码如下:
-- 调用存储过程,查询用户ID为5的订单数量 CALL count_user_orders(5, @total); -- 查看结果 SELECT @total;
注意事项
- 局部变量的声明必须放在存储过程的
BEGIN之后,所有执行语句之前,不能穿插在其他执行语句中间。 - 同一个存储过程中,变量名不能重复声明,否则会抛出重复声明的错误。
- 如果DEFAULT值设置为函数调用,比如
DEFAULT CURDATE(),函数会在存储过程被调用时执行,而不是在存储过程创建时执行。 - 局部变量的作用范围仅限于当前存储过程,不能在存储过程外部访问。
需要注意,DECLARE声明的局部变量和SET直接设置的用户变量不同,用户变量以@开头,作用范围是整个会话,而局部变量没有@前缀,仅在存储过程内部有效。
常见问题解答
可以不使用DEFAULT子句吗
可以,不使用DEFAULT子句时变量初始值为NULL,后续可以通过SET或者SELECT INTO语句给变量赋值。
DEFAULT值可以是表达式吗
可以,DEFAULT值可以是常量,也可以是返回对应数据类型的表达式,比如DECLARE start_date DATE DEFAULT DATE_SUB(CURDATE(), INTERVAL 7 DAY)是合法的。
局部变量可以和表字段同名吗
不建议同名,虽然语法上允许,但是在SQL语句中可能会出现歧义,导致查询结果不符合预期,建议变量名和表字段名做好区分。