存储过程 - 变量
MySQL 中的变量分三类:系统变量(服务器级)、用户变量(连接级)、局部变量(BEGIN ... END 块内),三者的定义者、作用域和声明方式各不相同。
一、对比
| 类型 | 定义者 | 作用域 | 是否需要声明 | 写法 |
|---|---|---|---|---|
| 系统变量 | MySQL 服务器 | 全局(GLOBAL)或会话(SESSION) | 否,由服务器提供 | @@变量名 |
| 用户变量 | 用户 | 当前连接 | 否,直接用 | @变量名 |
| 局部变量 | 用户 | 其所在的 BEGIN ... END 块 | 是,DECLARE | 变量名(无 @) |
二、系统变量
系统变量由 MySQL 服务器提供,不是用户定义的,分为 全局变量(GLOBAL) 和 会话变量(SESSION)。
查看
SHOW [SESSION | GLOBAL] VARIABLES; -- 查看所有系统变量
SHOW [SESSION | GLOBAL] VARIABLES LIKE '……'; -- 模糊匹配查找变量
SELECT @@[SESSION | GLOBAL].系统变量名; -- 查看指定变量的值
设置
SET [SESSION | GLOBAL] 系统变量名 = 值;
SET @@[SESSION | GLOBAL].系统变量名 = 值;
- 没有指定
SESSION/GLOBAL时,默认是 SESSION(会话变量)。- 通过
SET GLOBAL设置的全局参数,MySQL 服务重启后失效;要永久生效,需写入配置文件(如/etc/my.cnf)。
SHOW SESSION VARIABLES LIKE 'auto%';
SHOW GLOBAL VARIABLES LIKE 'auto%';
SELECT @@autocommit;
SELECT @@GLOBAL.autocommit;
SET SESSION autocommit = 0; -- 仅当前会话关闭自动提交
SET GLOBAL autocommit = 1; -- 全局开启自动提交(重启失效)
三、用户变量
用户根据需要自定义的变量,无需提前声明或初始化,直接用 @变量名 使用,作用域为当前连接。未赋值时取值为 NULL。
赋值
SET @var_name = expr [, @var_name = expr] ...;
SET @var_name := expr [, @var_name := expr] ...;
SELECT @var_name := expr [, @var_name := expr] ...;
SELECT 字段名 INTO @var_name FROM 表名;
SET @myname = 'itcast';
SET @myage := 10;
SET @mygender := '男', @myhobby := 'java';
SELECT @mycolor := 'red';
SELECT COUNT(*) INTO @mycount FROM tb_user;
-- 使用
SELECT @myname, @myage, @mygender, @myhobby, @mycolor, @mycount;
SELECT @abc; -- 未赋值 → NULL
易错:
SELECT里的=是比较运算,赋值必须用:=;SET里=和:=都可以。
四、局部变量
局部变量是根据需要定义的、只在 BEGIN ... END 块内生效的变量,访问前必须 DECLARE 声明,可用于存储过程 / 函数内部,也可用作输入参数。
声明
DECLARE 变量名 变量类型 [DEFAULT ...];
变量类型就是数据库字段类型,如
INT、BIGINT、CHAR、VARCHAR、DATE、TIME等。
赋值
SET 变量名 = 值;
SET 变量名 := 值;
SELECT 字段名 INTO 变量名 FROM 表名 ...;
CREATE PROCEDURE p2()
BEGIN
DECLARE stu_count INT DEFAULT 0;
SELECT COUNT(*) INTO stu_count FROM tb_user;
SELECT stu_count;
END;
CALL p2();
局部变量只能在声明它的
BEGIN ... END中使用,块外访问会报错。DECLARE必须写在块的开头,先于其他可执行语句。
速查
-- 系统变量:查看 / 设置(默认 SESSION;GLOBAL 重启后失效)
SHOW SESSION VARIABLES LIKE 'auto%'; -- 模糊查找
SELECT @@GLOBAL.autocommit; -- 查看全局值
SET SESSION autocommit = 0; -- 设置会话值
-- 用户变量:无需声明,= 或 := 赋值,SELECT 里只能用 :=
SET @myname := 'itcast';
SELECT COUNT(*) INTO @mycount FROM tb_user;
SELECT @myname, @mycount; -- 未赋值的变量为 NULL
-- 局部变量:必须 DECLARE,只在 BEGIN ... END 内有效
CREATE PROCEDURE p2()
BEGIN
DECLARE stu_count INT DEFAULT 0;
SELECT COUNT(*) INTO stu_count FROM tb_user;
SELECT stu_count;
END;
CALL p2();
| 类型 | 一句话 |
|---|---|
系统变量 @@ | 服务器配置,默认会话级 |
用户变量 @ | 连接内有效,直接用 |
| 局部变量 | DECLARE 声明,块内有效 |
相关
- 存储过程:创建、调用、参数(IN / OUT / INOUT)
- 存储过程:流程控制、游标与条件处理:局部变量配合 IF / 循环使用
- 事务:
autocommit与事务的关系