一、MySQL存储过程变量的定义(DECLARE)

语法:
DECLARE var_name [, var_name2, ...] data_type [DEFAULT default_value];
关键点:
位置要求:`DECLARE` 语句必须写在 `BEGIN ... END` 代码块的起始位置,并且要位于所有其他可执行语句之前。这是 MySQL 存储过程变量声明的基本规则。
默认值:如果没有使用 `DEFAULT` 子句,那么变量的初始值默认为 `NULL`。
作用域:局部变量只在当前声明它的 `BEGIN ... END` 块及其内部嵌套块中生效。
示例:
DELIMITER //
CREATE PROCEDURE example_procedure()
BEGIN
必须在BEGIN后优先声明变量
DECLARE my_sql INT DEFAULT 10; 整型变量,默认值为10
DECLARE student_name VARCHAR(50); 字符串变量,默认值为NULL
DECLARE total_price, discount DECIMAL(10,2); 一次声明多个相同数据类型的变量
DECLARE is_valid BOOLEAN DEFAULT TRUE; 布尔类型变量
后面才开始编写执行语句
END //
DELIMITER ;
二、为变量赋值(SET)
语法:
SET var_name = expr [, var_name2 = expr2, ...];
示例:
BEGIN
DECLARE a, b, c INT;
DECLARE name VARCHAR(100);
DECLARE price DECIMAL(10,2);
基础赋值
SET a = 10;
通过表达式进行赋值
SET b = a * 2 + 5;
一次为多个变量赋值
SET a = 1, b = 2, c = 3;
结合函数进行赋值
SET name = CONCAT('John', ' ', 'Doe');
SET price = ROUND(99.99 * 0.9, 2);
使用查询结果赋值(前提是查询必须只返回单个值)
SET @row_count = (SELECT COUNT(*) FROM tb_student);
END;
三、使用 SELECT...INTO 为变量赋值
语法:
SELECT column1, column2, ...
INTO var1, var2, ...
FROM table_name
WHERE condition
[LIMIT 1];
重要特点:
必须返回单行:查询结果必须有且只有一行,否则在 MySQL 存储过程中会报错。
变量匹配:`SELECT` 返回的列数量必须与 `INTO` 后面的变量数量保持一致。
常用场景:适合主键查询、聚合函数统计等能够确保只返回一行结果的 SQL 查询。
示例:
BEGIN
DECLARE v_id INT;
DECLARE v_name VARCHAR(50);
DECLARE v_score DECIMAL(5,2);
DECLARE v_a vg_score DECIMAL(5,2);
DECLARE v_count INT;
根据主键查询单条数据
SELECT id, name, score INTO v_id, v_name, v_score
FROM tb_student
WHERE id = 2;
使用聚合函数统计结果(可确保返回单行)
SELECT A VG(score), COUNT(*) INTO v_a vg_score, v_count
FROM tb_student;
通过LIMIT确保只取一行
SELECT name INTO v_name
FROM tb_student
WHERE score > 90
LIMIT 1;
END;
四、MySQL存储过程变量使用完整示例
DELIMITER //
下面创建一个存储过程,名称为calculate_student_stats,它接收一个学生ID作为输入参数,参数类型为整数。
BEGIN
声明局部变量
DECLARE v_student_name VARCHAR(50);
DECLARE v_score DECIMAL(5,2);
DECLARE v_class_a vg DECIMAL(5,2);
DECLARE v_performance VARCHAR(20);
使用SELECT...INTO获取学生信息
SELECT name, score INTO v_student_name, v_score
FROM tb_student
WHERE id = student_id;
使用查询计算班级平均分
SELECT A VG(score) INTO v_class_a vg FROM tb_student;
通过条件判断设置学生表现等级
IF v_score > v_class_a vg THEN
SET v_performance = 'Above A verage';
ELSEIF v_score = v_class_a vg THEN
SET v_performance = 'A verage';
ELSE
SET v_performance = 'Below A verage';
END IF;
输出最终结果
SELECT v_student_name AS '姓名',
v_score AS '分数',
v_class_a vg AS '班级平均分',
v_performance AS '表现';
END //
DELIMITER ;
调用存储过程
CALL calculate_student_stats(2);
五、使用 MySQL 变量时的注意事项
1. 作用域规则:内层代码块可以访问外层代码块中声明的变量,但外层无法访问内层声明的变量。
2. 变量名冲突:应尽量避免变量名与表字段名完全相同;如果无法避免,建议通过表名限定字段名。
3. 错误处理:对于可能返回多行或空结果的 `SELECT...INTO` 查询,建议增加异常处理逻辑。
4. 性能考虑:变量相关操作通常在内存中完成,执行效率相对较高,适合在存储过程和存储程序中使用。
六、用户变量与局部变量的区别
类型 局部变量 (DECLARE) 用户变量 (@var)
声明方式 DECLARE var_name TYPE SET @var = value
作用域 BEGIN...END 块内 当前会话(连接)
生命周期 代码块执行期间 整个会话期间
位置要求 必须在块开头声明 任何位置都可以使用
