mysql变量与游标

文章目录

  • mysql变量,流程控制与游标
    • 变量
      • 系统变量
      • 用户变量
      • 补充:MySQL的新特性-全局变量的持久化
    • 程序出错的处理机制
    • 游标的使用

mysql变量,流程控制与游标

变量

系统变量

查看全局系统变量:
SHOW GLOBAL VARIABLES
在这里插入图片描述
查看会话系统变量:
SHOW SESSION VATIABLES;
mysql变量与游标_第1张图片
SHOW VARIABLES;
默认查询的是会话系统变量
查询部分系统变量:
SHOW GLOBAL VARIABLES LIKE 'admin_%';
SHOW VARIABLES LIKE 'character_%';
查看指定系统变量:
MYSQL中的系统变量以两个@开头,其中“@@global”仅用于标记全局系统变量,其他同理。
SELECT @@global.max_connections;
在这里插入图片描述
修改系统变量的值
有些时候,数据库管理员需要修改系统变量的默认值,以便修改当前会话或者MYSQL服务实例的属性,特征,具体方法:
方式一:修改MySQL配置文件,继而修改MySQL系统变量的值(该方法需要重启MySQL服务)
mysql变量与游标_第2张图片
修改配置文件重启mysql代价太大
方式二:在MySQL服务运行期间,使用“set”命令重新设置系统变量的值
两种方式:
SET @@global.max_connections = 161;
SET GLOBAL max_connections = 171;
在这里插入图片描述
针对于当前的数据库实例是有效的,一旦重启mysql服务就失效了
重启mysql后又恢复了
在这里插入图片描述
修改会话系统变量:
方式一:
SET @@session.character_set_client='gbk';
SET SESSION character_set_client='gbk';
两个连接相当于两个会话,修改1其中一个会话系统变量不会影响另一个会话系统变量
在这里插入图片描述
针对于当前会话是有效的,一旦结束会话,重新建立起新的会话就会失效了

用户变量

MySQL的用户变量以一个@为开头,根据作用范围不同又分为会话用户变量和局部变量。

  • 会话用户变量:作用域和会话变量一样,只对当前连接会话有效。
  • 局部变量:只在BEGIN和END语句块中有效,局部变量只能在存储过程和函数中使用。

会话用户变量:
mysql变量与游标_第3张图片
mysql变量与游标_第4张图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
局部变量:
mysql变量与游标_第5张图片
mysql变量与游标_第6张图片
mysql变量与游标_第7张图片
mysql变量与游标_第8张图片
在这里插入图片描述
在这里插入图片描述
1.声明局部变量,并分别赋值为employees表中employee_ id为102 的last_ name和salary
mysql变量与游标_第9张图片
mysql变量与游标_第10张图片
在这里插入图片描述
2.声明两个变量,求和并打印(分别使用会话用户变量、局部变量的方式实现)
mysql变量与游标_第11张图片
mysql变量与游标_第12张图片
在这里插入图片描述
在这里插入图片描述
对比会话用户变量与局部变量:

在这里插入图片描述

补充:MySQL的新特性-全局变量的持久化

在MySQL数据库中,全局变量可以通过SET GLOBAL语句来设置。例如,设置服务器语句超时的限制,可以通过设
置系统变量max_execution _time来实现:
SET GLOBAL MAX_EXECUTION_TIME=2000;
使用SET GLOBAL语句设置的变量值只会临时生效。数据库重启后,服务器又会从MySQL配置文件中读取变量的默
认值。
MySQL 8.0版本新增了SET PERSIST 命令。例如,设置服务器的最大连接数为1000:
SET PERSIST global max_connections = 1000;
MySQL会将该命令的配置保存到数据目录下的mysqld-auto.cnf文件中,下次启动时会读取该文件,用其中的配置来覆盖默认的配置文件。
mysql变量与游标_第13张图片
mysql变量与游标_第14张图片

程序出错的处理机制

mysql变量与游标_第15张图片
在这里插入图片描述
定义处理程序:
可以为SQL执行过程中发生的某种类型的错误定义特殊的处理程序。定义处理程序时,使用DECLARE语句的语法:
DECLARE 处理方式 HANDLER FOR 错误类型 处理语句

  • 处理方式:处理方式有3个取值: CONTINUE、 EXIT、 UNDO。
    • CONTINUE :表示遇到错误不处理,继续执行。
    • EXIT :表示遇到错误马上退出。
    • UNDO:表示遇到错误后撤回之前的操作。MySQL中暂时不支持这样的操作。
  • 错误类型可以有如下值:
    • SQLSTATE ‘字符串错误码’ :表示长度为5的sqlstate_ _value类型的错误代码;
    • MySQL _ error_ code :匹配数值类型错误代码;
    • 错误名称:表示DECLARE … CONDITION定义的错误条件名称。
    • SQLWARNING :匹配所有以01开头的SQLSTATE错误代码;
    • NOT FOUND: 匹配所有以02开头的SQLSTATE错误代码;
    • SQLEXCEPTION:匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误代码;
      mysql变量与游标_第16张图片
      mysql变量与游标_第17张图片
      mysql变量与游标_第18张图片
      mysql变量与游标_第19张图片
      在这里插入图片描述
      mysql变量与游标_第20张图片

mysql变量与游标_第21张图片
mysql变量与游标_第22张图片
在这里插入图片描述

游标的使用

游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。
如果我们想要使用游标,一般需要经历四个步骤。不同的DBMS中,使用游标的语法可能略有不同。

  • 第一步:声明游标
    在MySQL中,使用DECLARE关键字来声明游标,其语法的基本形式如下:
    DECLARE cursor_name CURSOR FOR select_statement;
    要使用SELECT语句来获取数据结果集,而此时还没有开始遍历数据,这里select. _statement 代表的是SELECT语句,返回一个用于创建游标的结果集。
  • 第二步:打开游标
    OPEN cursor_name
    当我们定义好游标之后,如果想要使用游标,必须先打开游标。打开游标的时候SELECT语句的查询结果集就会送到游标工作区,为后面游标的逐条读取结果集中的记录做准备。
  • 第三步:使用游标
    FECTH cursor_name INTO var_name [,var_name]...
    这句的作用是使用cursor_name这个游标来读取当前行,并且将数据保存到var_name这个变量中,游标指针直到下一行。如果游标读取的数据行有多个列名,则在INTO关键字后面赋值多个变量名即可。
  • 第四步:关闭游标
    CLOSE cursor_name
    有OPEN就会有CLOSE,也就是打开和关闭游标。当我们使用完游标后需要关闭掉该游标。因为游标会占用系统资源,如果不及时关闭,游标会一直保持到存储过程结束,影响系统运行的效率。而关闭游标的操作,会释放游标占用的系统资源。
    举例:
    创建存储过程get_ count_ by_ limit_ total_ salary(), 声明IN参数limit_ total_ salary,DOUBLE类型;声明OUT参数total_ count, INT类型。函数的功能可以实现累加薪资最高的几个员工的薪资值,直到薪资总和达到limit_ total_ Salary参数的值,返回累加的人数给total_ count 。
    mysql变量与游标_第23张图片
    在这里插入图片描述
    mysql变量与游标_第24张图片
    在这里插入图片描述
    在这里插入图片描述
    小结:
    游标是MySQL的一个重要的功能,为逐条读取结果集中的数据,提供了完美的解决方案。跟在应用层面实现相同的功能相比,游标可以在存储程序中使用,效率高,程序也更加简洁。
    但同时也会带来一些性能问题, 比如在使用游标的过程中,会对数据行进行加锁,这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足,这是因为游标是在内存中进行的处理。
    用完要关闭游标哦。

你可能感兴趣的:(mysql,mysql,数据库,java)