• mysql变量与游标


    mysql变量,流程控制与游标

    变量

    系统变量

    查看全局系统变量:
    SHOW GLOBAL VARIABLES
    在这里插入图片描述
    查看会话系统变量:
    SHOW SESSION VATIABLES;
    在这里插入图片描述
    SHOW VARIABLES;
    默认查询的是会话系统变量
    查询部分系统变量:
    SHOW GLOBAL VARIABLES LIKE 'admin_%';
    SHOW VARIABLES LIKE 'character_%';
    查看指定系统变量:
    MYSQL中的系统变量以两个@开头,其中“@@global”仅用于标记全局系统变量,其他同理。
    SELECT @@global.max_connections;
    在这里插入图片描述
    修改系统变量的值
    有些时候,数据库管理员需要修改系统变量的默认值,以便修改当前会话或者MYSQL服务实例的属性,特征,具体方法:
    方式一:修改MySQL配置文件,继而修改MySQL系统变量的值(该方法需要重启MySQL服务)
    在这里插入图片描述
    修改配置文件重启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语句块中有效,局部变量只能在存储过程和函数中使用。

    会话用户变量:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    局部变量:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    1.声明局部变量,并分别赋值为employees表中employee_ id为102 的last_ name和salary
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2.声明两个变量,求和并打印(分别使用会话用户变量、局部变量的方式实现)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    对比会话用户变量与局部变量:

    在这里插入图片描述

    补充: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文件中,下次启动时会读取该文件,用其中的配置来覆盖默认的配置文件。
    在这里插入图片描述
    在这里插入图片描述

    程序出错的处理机制

    在这里插入图片描述
    在这里插入图片描述
    定义处理程序:
    可以为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错误代码;
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    游标的使用

    游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。
    如果我们想要使用游标,一般需要经历四个步骤。不同的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的一个重要的功能,为逐条读取结果集中的数据,提供了完美的解决方案。跟在应用层面实现相同的功能相比,游标可以在存储程序中使用,效率高,程序也更加简洁。
      但同时也会带来一些性能问题, 比如在使用游标的过程中,会对数据行进行加锁,这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足,这是因为游标是在内存中进行的处理。
      用完要关闭游标哦。
  • 相关阅读:
    linux遇见的问题
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java情报综合管理系统36zgo
    大数据运维实战第二课 大话 Hadoop 发行版选型和伪分布式平台的构建
    04 Spring 注解实现IOC
    C语言 字符串
    ProxmoxVE迁移虚拟机到其他PVE(基于QCOW2)
    FineBI 的过滤类型及应用场景
    Vue-router的传参和跳转及高级使用
    Azure DevOps Server 设置项目管理用户,用户组
    【SQL屠夫系列】leetcode-176. 第二高的薪水
  • 原文地址:https://blog.csdn.net/Jiaodaqiaobiluo/article/details/127757467