理解MySQL的会话变量、局部变量和全局变量

2023-09-19 09:49:19

理解MySQL的会话变量、局部变量和全局变量

1.MySQL变量分类

根据作用范围不同,分为会话用户变量局部变量
会话用户变量:作用域和会话变量一样,只对当前连接会话有效 。
局部变量:只在 BEGIN 和 END 语句块中有效,局部变量只能在存储过程和存储函数中使用 。
全局变量:在MySQL服务器启动运行后,系统内置变量 。

2.变量定义

(1)会话变量:

MySQL 编码规范,MySQL 中的用户变量以一个 “@” 开头,可以与关键字区分。
@varn @varc 用户会话变量:

mysql> set @varn=100,@varc='AAA';
Query OK, 0 rows affected (0.00 sec)

mysql> select @varn,@varc ;
+-------+-------+
| @varn | @varc |
+-------+-------+
|   100 | AAA   |
+-------+-------+
1 row in set (0.00 sec)

mysql> 

(2)局部变量

loc_n loc_c ,在存储过程中定义,局部变量。

delimiter $$
create procedure  pro_test_var()
BEGIN
DECLARE loc_n INTEGER ;
DECLARE loc_c varchar(10) ;

set loc_n=10;
set loc_c='BBB';

set @varn=1 ,@varc='CCC';
select @varn,@varc ;
select loc_n,loc_c ;
 
END
$$

在存储过程中可以调用修改用户会话变量。执行效果:

mysql> call pro_test_var();
+-------+-------+
| @varn | @varc |
+-------+-------+
|     1 | CCC   |
+-------+-------+
1 row in set (0.00 sec)

+-------+-------+
| loc_n | loc_c |
+-------+-------+
|    10 | BBB   |
+-------+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

在会话中无法查询局部变量:

mysql> select loc_n,loc_c ;
ERROR 1054 (42S22): Unknown column 'loc_n' in 'field list'
mysql> select @varn,@varc ;
+-------+-------+
| @varn | @varc |
+-------+-------+
|     1 | CCC   |
+-------+-------+
1 row in set (0.00 sec)

3.用户会话变量限制

(1)不能做存储过程调用参数

在存储过程中做入口参数,提示语法错误

create procedure pro_test_callvar(in @varc varchar(10))

mysql> delimiter $$
mysql> create procedure  pro_test_callvar(in @varc varchar(10))
    -> BEGIN
    -> DECLARE loc_n INTEGER ;
    -> DECLARE loc_c varchar(10) ;
    -> 
    -> set loc_n=10;
    -> set loc_c='BBB';
    -> 
    -> set @varn=1 ,@varc='CCC';
    -> select @varn,@varc ;
    -> select loc_n,loc_c ;
    ->  
    -> END
    -> $$
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@varc varchar(10))
BEGIN
DECLARE loc_n INTEGER ;
DECLARE loc_c varchar(10) ;

se' at line 1

(2)不能用于fetch

CREATE DEFINER=`root`@`%` PROCEDURE `pro_test_fetch_cursor`()
begin
  #declare var_tel varchar(15);
  declare done int default 0 ;
  declare cur_tel cursor for select t.hm_detail from check_cmcc t order by t.hm_detail limit 10;
  #游标结标志,必须在游标声明后声明!!!否则报错
  declare continue handler for not found set done = 1 ;

  #使用游标前打开游标
  open cur_tel ;
  #循环的标签名称,要和end loop 对应。
  getloop :  loop
    # 将游标变量赋值到用户会话变量  
    fetch cur_tel  into  @var_tel ;
		
    if done = 1 
      then leave getloop ;
    end if ;

  end loop getloop;
  close cur_tel ;

end

提示错误信息:
在这里插入图片描述
定义局部变量 declare var_tel varchar(15),就可以使用fetch 。

CREATE DEFINER=`root`@`%` PROCEDURE `pro_test_fetch_cursor`()
begin
  declare var_tel varchar(15);
  declare done int default 0 ;
  declare cur_tel cursor for select t.hm_detail from check_cmcc t order by t.hm_detail limit 10;
  #游标结标志,必须在游标声明后声明!!!否则报错
  declare continue handler for not found set done = 1 ;

  #使用游标前打开游标
  open cur_tel ;
  #循环的标签名称,要和end loop 对应。
  getloop :  loop
      
    fetch cur_tel  into var_tel ;
	
			
    if done = 1 
      then leave getloop ;
    end if ;

  end loop getloop;
  close cur_tel ;

end

4. 全局变量

由系统提供,在整个数据库有效,用法:@@global.var_name
注意:
如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认session 。

-- 查看全局变量 
show global variables; 
SHOW GLOBAL VARIABLES LIKE '%sort%';
mysql> SHOW GLOBAL VARIABLES LIKE '%sort_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_sort_buffer_size | 1048576   |
| myisam_sort_buffer_size | 134217728 |
| sort_buffer_size        | 4194304   |
+-------------------------+-----------+
3 rows in set (0.00 sec)

-- 查看某全局变量 
select @@global.sort_buffer_size ;

修改全局变量:

mysql> select  @@global.sort_buffer_size;
+---------------------------+
| @@global.sort_buffer_size |
+---------------------------+
|                   8388608 |
+---------------------------+
1 row in set (0.00 sec)

mysql> set @@global.sort_buffer_size=4194304;
Query OK, 0 rows affected (0.00 sec)

mysql> select  @@global.sort_buffer_size;
+---------------------------+
| @@global.sort_buffer_size |
+---------------------------+
|                   4194304 |
+---------------------------+
1 row in set (0.00 sec)

5. 变量理解

(1)会话用户变量

作用域:当前会话
定义位置:会话的任何地方
语法:加@符号,不用指定类型

(2)局部变量

作用域:定义程序块的begin到end
定义位置:begin到end 结束中的第一次声明
语法:一般不用加@,需要指定数据类型

(3)全局变量

作用域:MySQL服务器每次启动将为所有的全局变量赋初始值,针对于所有会话(连接)有效,不能跨服务器重启 。
定义位置:系统内置
语法:加前缀 @@global

更多推荐

Python+pytest接口自动化之参数关联

一、什么是参数关联?参数关联,也叫接口关联,即接口之间存在参数的联系或依赖。在完成某一功能业务时,有时需要按顺序请求多个接口,此时在某些接口之间可能会存在关联关系。比如:B接口的某个或某些请求参数是通过调用A接口获取的,即需要先请求A接口,从A接口的返回数据中拿到需要的字段值,在请求B接口时作为请求参数传入。二、有哪些

Hoeffing不等式

在李航老师的统计学习方法(第一版中)Hoeffing不等式Hoeffing不等式Hoeffing不等式是这样子给出的设X1,X2,...,XNX_1,X_2,...,X_NX1​,X2​,...,XN​是独立随机变量,且Xi∈[ai,bi],i=1,2,...,N;SN=∑i=1NXiX_i\in[a_i,b_i],i

VMware Fusion 13在M2芯片的Mac上安装 Windows 11

首先需要下载Windows11镜像以下给出一种官方方法,当然也可以自己去网上搜索,有很多资源注册微软账号使用注册的账号登录访问:https://www.microsoft.com/en-us/windowsinsider/register使用登录的账号注册Windows11InsiderProgram看到以下页面,就是

【2023华为杯A题】WLAN网络信道接入机制建模(代码、思路.....)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1背景1.1分布式信道接入和二进制指数退避1.2基于Markovchain的DCF机制建模和系统性能分析📚2WLAN组

Apache shenyu,Java 微服务网关的首选

微服务网关的产生背景当我们系统复杂度越来越高,团队协作效率越来越低时,我们通常会想到通过"拆分"来应对,这是典型的"化繁为简,分而治之"的思想。在落地过程中,我们通常会引入"SOA"或者"微服务"架构手段,如下图所示:技术更新日新月异,站在当下去看,“微服务”、“API网关”、“云原生”、“servicemesh”…这

CFCA证书 申请 流程(一)

CFCA证书CFCA证书是指由中国金融认证中心颁发的证书,包括普通数字证书、服务器数字证书和预植证书等,目前,各大银行和金融机构都会使用CFCA颁发的证书作为官网的HTTPS证书、手机银行等APP使用的证书以及USB-KEY(U盾)内置的证书。在案例中包括中国工商银行、中国民生银行、中国光大银行、中信银行、兴业银行、中

NSS [西湖论剑 2022]real_ez_node

NSS[西湖论剑2022]real_ez_node考点:ejs原型链污染、NodeJS中Unicode字符损坏导致的HTTP拆分攻击。开题。附件start.sh。flag位置在根目录下/flag.txtapp.js(这个没多大用)varcreateError=require('http-errors');varexpr

企业微信-通用开发参数回调设置

公司业务需要开发企业微信,注册三方服务商审核通过后,开始配置开发信息。本篇中记录在调试url验证中遇到错误及解决方式。目录准备工作下载php加解密库下载文件说明设置白名单设置路径参数说明设置ip回调处理回调类型:1、Get类型2、Post类型Get回调实现设置路由控制器业务层处理配置开发信息遇到问题发现问题解决方案准备

学习路之工具--SecureCRT的下载、安装

百度盘:链接:https://pan.baidu.com/s/1r3HjEj053cKys54DTqLM4A?pwd=gcac提取码:gcac复制这段内容后打开百度网盘手机App,操作更方便哦感谢大佬简单介绍下SecureCRTSecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windo

小米云原生文件存储平台化实践:支撑 AI 训练、大模型、容器平台多项业务

小米作为全球知名的科技巨头公司,已经在数百款产品中广泛应用了AI技术,这些产品包括手机、电视、智能音箱、儿童手表和翻译机等。这些AI应用主要都是通过小米的深度学习训练平台完成的。在训练平台的存储方案中,小米曾尝试了多种不同的存储方式,包括Ceph+NFS、HDFS和对象存储挂载等。然而,这些不同的存储方式导致了数据冗余

SpringCloud Gateway搭建Gateway 微服务应用实例

😀前言本篇博文是关于SpringCloudGateway搭建Gateway微服务应用实例,希望你能够喜欢🏠个人主页:晨犀主页🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰如果文章有什么需要改进

热文推荐