MySQL数据库,变量、流程控制与游标

变量

系统变量

系统变量分为全局系统变量(需要添加global关键字)以及会话系统变量(需要添加session关键字)有时将全局系统变量简称为全局变量,将会话系统变量称为local变量。如果不写,默认会话级别。静态变量属于特殊的全局系统变量。

注:

  • 全局系统变量针对于所有的会话(连接)有效,但不能跨重启。

  • 会话系统变量仅针对于当前会话(连接)有效,会话期间,当前会话对某个会话系统变量值的修改,不会影响其他会话同一个会话系统变量的值。

  • 会话1对某个全局变量值的修改会导致会话2中同一个全局变量值的修改。

查看系统变量

查看所有全局变量:

SHOW GLOBAL VARIABLES [LIKE '……'];

查看所有会话变量:

SHOW SESSION VARIABLES [LIKE '……'];

SHOW VARIABLES;-- 默认会话级别

MySQL中的系统变量以两个@开头,其中@@global仅用于标记全局系统变量,@@session仅用于标记会话系统变量。@@后如果未跟global或session,@@会首先标记会话系统变量,如果会话系统变量不存在,则标记全局系统变量。

查看指定的全局系统变量的值:

SELECT @@global.变量名;

查看指定的会话变量的值

SELECT @@session.变量名;

或者

SELECT @@变量名;

修改系统变量的值

方式一:修改MySQL配置文件,继而修改MySQL系统变量的值(该方法需要重启MySQL服务)

方式二:在MySQL服务运行期间,使用SET命令重新设置系统变量的值。

为某个系统变量赋值

SET @@global.变量名 = 变量值;

SET GLOBAL 变量名 = 变量值;

针对于当前的数据库实例有效,一旦重启MySQL服务就失效。

为某个会话变量赋值

SET @@session.变量名 = 变量值;

SET SESSION 变量名 = 变量值;

对当前会话有效

用户变量

用户变量是用户自己定义的,作为MySQL编码规范,MySQL中的用户变量以一个@开头。根据作用范围的不同,又分为会话用户变量和局部变量。

  • 会话用户变量:作用域和会话变量一样,只对当前连接的会话有效。

  • 局部变量:只在BEGIN和END语句中有效。局部变量只能在存储过程和存储函数中使用

会话用户变量

变量的定义:

方式一:使用SET的方式

SET @用户变量 = 值;

SET @用户变量 := 值;

方式二:查询时使用INTO的方式

SELECT 表达式 INTO @用户变量 [FROM等子句];

SELECT @用户变量 :=表达式 [FROM等子句];

查看用户变量的值(查看、比较、运算等)

SELECT @用户变量

SELECT @用户变量……

局部变量

定义:使用DECLARE语句定义一个局部变量

作用域:只在BEGIN和END中间有效。

位置:只能放在BEGIN和END中,且只能放在第一句

BEGIN

声明局部变量

DECLARE 变量名 变量数据类型 [DEFAULT 变量默认值];

DECLARE 变量名,变量名,…… 变量数据类型 [变量默认值];

为局部变量赋值

SET 变量名 = 值;

SELECT 值 INTO 变量名 [FROM 子句];

查看局部变量的值

SELECT 变量名,变量名,……;

END

注:局部变量如果没有DEFAULT子句,初始值为NULL

定义条件与处理程序

定义条件是事先定义程序执行过程中可能遇到的问题,处理程序定义了在遇到问题时的处理方式,并且保证存储过程或存储函数在遇到警告时能继续执行。

定义条件

定义条件就是给MySQL中的错误码命名,有助于存储的程序代码更清晰。定义条件将一个错误名字和指定的错误条件关联起来。这个名字可以随后被用在处理程序的DECLARE HANDLER语句中。

定义条件使用DECLARE语句,语法格式如下:

DECLARE 错误名称 CONDITION FOR 错误代码(或错误条件);

关于错误码:

注:如果错误码是由数字组成的字符串,为了防止发生隐式转换,要在此错误码前加上SQLSTATE

定义处理程序

可以为SQL执行过程中发生的某种类型的错误定义特殊的处理程序。使用DECLARE语句的语法格式:

DECLARE 处理方式 HANDLER FOR 错误类型 处理语句;

关于处理方式、错误类型、处理语句:(打字好累,截图偷懒)

例:使用CONTINUE的方式:(last_name字段有非空约束)

DELIMITER $CREATE PROCEDURE test_exception()BEGINDECLARE CONTINUE HANDLER FOR 1048 SET @prc_val = -1;SET @ss = 1;UPDATE test_1 SET last_name = NULL WHERE id = 1;SET @ss = 9;UPDATE test_1 SET last_name = 'Peter' WHERE id = 1;END $DELIMITER ;CALL test_exception();SELECT @ss,@prc_val;

结果为:

使用EXIT的方式:(id字段有唯一性约束,表中已有id为2的记录)

DELIMITER $CREATE PROCEDURE test_bb()BEGINDECLARE EXIT HANDLER FOR 1062 SET @pro_val = 66;SET @x = 1;INSERT INTO test_1VALUES(2,'Tony','@hyhi',5000);SET @x = 9;END $DELIMITER ;CALL test_bb();SELECT @x,@pro_val;

结果为

流程控制

流程控制语句的作用是控制存储过程或存储函数中SQL语句的执行顺序。流程分为三类:

顺序结构:程序从上往下依次执行。

分支结构:程序按条件进行选择执行,从多条语句中选择其中一条执行。

循环结构:程序满足一定条件下,重复执行一组语句。

 流程控制语句主要有三类:

条件判断语句:IF语句和 CASE语句

循环语句:LOOP、WHILE和REPEAT语句

跳转语句:ITERATE、LEAVE语句

分支结构之IF

IF语句的语法结构是

IF search_condition THEN

    statement_list

ELSE IF search_condition THEN

    statement_list 

……

ELSE

    statement_list

END IF;

根据表达式的结果为TRUE或FALSE执行相应的语句。使用在BEGIN……END中。

 分支语句之CASE

CASE的语句格式有两种:

用法与Java中和C语言的流程控制差不多,套模板就可以。

循环结构之LOOP

LOOP循环语句用来重复执行某些语句。LOOP内的语句一直重复执行直到循环被退出(使用分支语句加LEAVE子句),跳出循环过程。

LOOP语句的格式:

其中,loop_label表示LOOP语句的标注名称,可以省略。

例:当id < 10时将重复执行循环过程。

DELIMITER  $CREATE PROCEDURE test_loop()BEGINDECLARE id INT DEFAULT 0;aa:LOOPSET id = id + 1;IF id >= 10 THENLEAVE aa;END IF;END LOOP aa;SELECT id;END $DELIMITER ;CALL test_loop;

例:将所有的员工的工资提高1.1倍,如果没有达到公司平均工资3500以上,继续提高1.1倍,……直到公司平均工资达到3500以上。

DELIMITER  $CREATE PROCEDURE test_loop_1(OUT num INT)BEGINDECLARE avg_sal DECIMAL(7,2);DECLARE loop_count INT DEFAULT 0;SELECT AVG(sal) INTO avg_sal FROM emp_loop;aaa: LOOPIF avg_sal >= 3500 THENLEAVE aaa;END IF;-- 跳出循环的条件UPDATE emp_loop SET sal = sal * 1.1;-- 涨薪SELECT AVG(sal) INTO avg_sal FROM emp_loop;-- 更新员工平均工资SET loop_count = loop_count + 1;-- 更新循环次数END LOOP aaa;SELECT loop_count INTO num;END $DELIMITER ;SET @x = 0;CALL test_loop_1(@x);SELECT @x;

循环结构之WHILE

WHILE语句创建一个带条件判断的循环过程。WHILE在执行语句时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。

while_label为WHILE语句的标注名称。如果循环条件结果为真,WHILE语句内的语句或语句群被执行,直到循环条件判断为假,退出循环。

和C语言与Java中的while循环差不多。

例:(没有使用循环标签)

DELIMITER $CREATE PROCEDURE test_while()BEGINDECLARE num INT DEFAULT 0;WHILE num <= 10 DOSET num = num + 1;END WHILE;SELECT num;END $DELIMITER ;CALL test_while();

例:将所有的员工的工资降低到0.8倍,如果没有达到公司平均工资2500以下,继续提高降低到0.8倍,……直到公司平均工资达到2500以下。

DELIMITER  $CREATE PROCEDURE test_while_1(OUT num INT)BEGINDECLARE avg_sal DECIMAL(7,2);DECLARE loop_count INT DEFAULT 0;SELECT AVG(sal) INTO avg_sal FROM emp_loop;WHILE avg_sal > 2500 DOUPDATE emp_loop SET sal = sal * 0.8;SELECT AVG(sal) INTO avg_sal FROM emp_loop;SET loop_count = loop_count + 1;END WHILE;SELECT loop_count INTO num;END $DELIMITER ;SELECT AVG(sal) FROM emp_loop;SET @s = 0;CALL test_while_1(@s);SELECT @s;

循环结构之REPEAT

REPEAT语句创建一个带条件判断的循环过程。与WHILE不同的是,REPEAT循环会首先执行一次循环,然后在UNTIL中进行表达式的判断,如果满足条件就退出。类似于C语言和Java中的do while循环

REPEAT就不写例子了,与前面的例子基本一样,只是格式不一样。

跳转结构之LEAVE语句

运行了LEAVE语句后,跳出整个循环。

格式:

LEAVE [label]

其中,label表示某个循环的标志。也可以给BEGIN …… END赋上标签,表示跳出此BEGIN …… END语句

相当于C语言和Java中的break语句

跳转结构之ITERATE

ITERATE语句:只能用在循环语句中,表示跳过此次循环,进入到下一次循环。

格式:

ITERATE [label]

相当于C语言和Java中的continue语句

游标

游标提供了一种灵活的操作方式,能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。

游标可以在存储过程存储函数中使用。

游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。

游标使用步骤:

①声明游标:

②打开游标:

③使用游标:

④关闭游标:

注:

游标的作用有点类似于Java的迭代器Iterator。每执行一次FETCH操作就类似于执行一次迭代器中的next方法的操作,返回当前指向的元素后,将指针指向下一个元素(即逐条读取,通常与循环一起使用)。

例:按员工从大到小开始计算,逐个累加员工工资直到总和达到20000.

DELIMITER $CREATE PROCEDURE test_yb(IN total_sal DECIMAL(7,2),OUT total_count INT)BEGIN#声明局部变量DECLARE sum_sal DECIMAL(7,2) DEFAULT 0.0;-- 记录累加的工资总和DECLARE emp_sal DECIMAL(7.2) DEFAULT 0.0;-- 记录每一个员工的工资DECLARE emp_count INT DEFAULT 0;-- 记录累加的人数-- 声明游标DECLARE emp_cursor CURSOR FOR SELECT sal FROM emp ORDER BY sal DESC;-- 打开游标OPEN emp_cursor;-- 使用游标REPEATFETCH emp_cursor INTO emp_sal;SET sum_sal = sum_sal + emp_sal;SET emp_count = emp_count + 1;UNTIL sum_sal >= total_sal END REPEAT;SET total_count = emp_count;-- 关闭游标CLOSE emp_cursor;END $DELIMITER ;SET @count_emp = 0;CALL test_yb(20000,@count_emp);SELECT @count_emp;

全局变量的持久化:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在页面中加入百度地图

官方文档&#xff1a;jspopularGL | 百度地图API SDK (baidu.com) 添加一下代码就可以实现 <!DOCTYPE html> <html> <head><meta name"viewport" content"initial-scale1.0, user-scalableno"/><meta http-equiv"Conten…

超分辨率重建——SAN训练自己数据集及推理测试(详细图文教程)

目录 一、源码包下载二、数据集准备三、预训练权重文件四、训练环境五、训练5.1 超参数修改5.2 训练模型5.2.1 命令方式训练5.2.2 Configuration配置参数方式训练 5.3 模型保存 六、推理测试6.1 超参数修改6.2 测试6.2.1 命令方式测试6.2.2 Configuration配置参数方式测试 6.3 …

响应者链概述

响应者链 iOS事件的3大类型 Touch Events(触摸事件)Motion Events(运动事件&#xff0c;比如重力感应和摇一摇等)Remote Events(远程事件&#xff0c;比如用耳机上得按键来控制手机) 触摸事件 处理触摸事件的两个步骤 寻找事件的最佳响应者事件的响应在响应链中的传递 寻…

Web UI 自动化 元素定位利器

序 元素定位&#xff0c;对于 Web UI 自动化而言&#xff0c;绝对是大家成长道路上的一道绊脚石。 很多初学者&#xff0c;都“死”在了元素定位上&#xff0c;从而失去了学习的兴趣。导致职业规划不得不半途而废~ 那么&#xff0c;今天&#xff0c;我们就使用 Katalon Stu…

深入理解CI/CD与Docker集成:自动化构建和部署的完整指南

在当今软件开发的快节奏环境中&#xff0c;自动化构建和部署是实现敏捷开发和DevOps实践的关键。Docker容器技术为这一过程引入了更高的灵活性和一致性。本文将深入研究如何将持续集成/持续部署&#xff08;CI/CD&#xff09;与Docker集成&#xff0c;提供更详细、实用的示例代…

向华为学习:基于BLM模型的战略规划研讨会实操的详细说明,含研讨表单(二)

上一篇文章&#xff0c;华研荟结合自己的经验和实践&#xff0c;详细介绍了基于BLM模型的战略规划研讨会的设计和组织流程&#xff0c;提高效率的做法。有朋友和我私信沟通说&#xff0c;其实这个流程不单单适合于BLM模型的战略规划研讨会&#xff0c;实际上&#xff0c;使用其…

v851s ssh搭建与使用

ssh 概述: 1. 用来远程登录的一种安全通道协议(常用于linux 、UNIX中); 2. 分为服务端和客户端: 1)服务端即openSSH ,一般属于目标开发板(linux中配置文件路径/etc/ssh/sshd_config); 2)客户端即登录端,常用工具:sercureCRT 、MobaXterm 、Putty等; 1. ssh 服务…

解锁数据探索新时代,JetBrains DataGrip 2023 Mac/win中文版下载

JetBrains DataGrip 2023 Mac/win&#xff0c;作为一款全新的数据库管理和开发工具&#xff0c;为数据工程师、分析师和开发人员提供了强大的功能和工具&#xff0c;帮助他们更高效地处理和分析数据。无论你是使用Mac还是Windows系统&#xff0c;都能够通过这款软件轻松驾驭数据…

springMVC 学习总结(四) 拦截器及统一异常处理

一.拦截器 1.拦截器与过滤器的区别 拦截器 Interceptor 和 过滤器 Filter类似&#xff0c;主要用于拦截用户请求并作出一定处理操作&#xff0c; 但两则也有不同之处&#xff0c;如过滤器只在Servlet前后起作用&#xff0c;是Servlet规范定义的&#xff0c;是Servlt容器才支…

CTF网络安全大赛是干什么的?发展史、赛制、赛程介绍,参赛需要学什么?

CTF&#xff08;Capture The Flag&#xff09;是一种网络安全竞赛&#xff0c;它模拟了各种信息安全场景&#xff0c;旨在提升参与者的网络安全技能。CTF 赛事通常包含多种类型的挑战&#xff0c;如密码学、逆向工程、网络攻防、Web 安全、二进制利用等。 发展史 CTF 的概念…

SpringBoot中处理处理国际化

SpringBoot中处理处理国际化 1. 创建SpringBoot项目2. resource下创建i18n目录3. 右键i18n新建资源包4. 弹框中添加需要支持的国际化语言5. messages.properties中添加需要国际化的键6. application.yaml添加配置7. 国际化工具8. 使用功能9 场景问题 1. 创建SpringBoot项目 2.…

spring 基于注解管理bean @Autowired

目录结构&#xff1a; 代码示例&#xff1a; UserContronller.java package com.atguigu.spring6.autowired.controller;import com.atguigu.spring6.autowired.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springfra…

阿里云对象存储OSS外网流出流量异常增多导致费用上升的解决方法

本文介绍在使用阿里云的对象存储 OSS服务过程中&#xff0c;外网流量消耗异常增多并导致异常的费用支出这一情况的问题发现、问题定位与几种不同的问题解决方法。 细细数来&#xff0c;写博客已经有近3的历史了&#xff0c;这成为了一项已经陪伴我大半人生的工作&#xff1b;也…

二十章总结

一.线程简介 二.创建线程 1.继承Thread类 Thread类中常用的两个构造方法如下&#xff1a; public Thread():创建一个新的线程对象。 public Thread(String threadName):创建一个名称为threadName的线程对象。 继承Thread类创建一个新的线程的语法如下&#xff1a; p…

设计模式 简单工厂 工厂方法模式 抽象工厂模式

工厂模式介绍 工厂模式是我们最常用的实例化对象模式了&#xff0c;是用工厂方法代替new操作的一种模式。它是创建型模式。 简单工厂 简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式 简单工厂适用于工厂类负责创建的对象较少的场景,…

如何在Go中并发运行多个函数

引言 Go语言的一个流行特性是它对并发的一流支持,即一个程序可以同时做多件事。随着计算机从更快地运行单个代码流转向同时运行更多代码流,能够并发地运行代码正在成为编程的重要组成部分。为了让程序运行得更快,程序员需要把程序设计成并发运行,这样程序中并发的每一部分…

mmpose 使用笔记

目录 自己整理的可以跑通的代码&#xff1a; 图片demo&#xff1a; 检测加关键点 自己整理的可以跑通的代码&#xff1a; 最强姿态模型 mmpose 使用实例-CSDN博客 图片demo&#xff1a; python demo/image_demo.py \tests/data/coco/000000000785.jpg \configs/body_2d_k…

AE-制作绚丽的图形通道

目录 1.新建合成命名为四边形 2.在合成中新建纯色层命名为tao 3.在纯色层上添加RG Trapcode –>Tao 效果&#xff0c;设置Segment参数 4. 在合成中添加摄像机 5.设置Tao Repeat Paths 相关参数&#xff0c;并调整摄像机的位置 6.设置Tao的 Material & Lighting 等…

基于Springboot的高校教学评价系统的设计与实现(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于Springboot的高校教…

如何通过TortoiseGit可视化工具查看Git管理的版本树和信息(工作树变更)内容

一、版本树 黑色直线&#xff1a;master分支和基于master分支拉取基础分支都在这条线上&#xff0c;是一条直线。 其他线条&#xff1a;新开分支一定会增加一条线&#xff0c;但不一定每一条线分别代表一个分支。 注&#xff1a;如果一直是一个人&#xff0c;在同一个本地分支…