⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述



1. 介绍

存储过程

  • 🚀什么是存储过程?
    • 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的
    • 存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。

  • 🚀存储过程的特点?
    • 代码的封装,复用
    • 可以接收参数,也可以返回数据
    • 减少网络交互,提升效率



2. 使用

存储过程的使用

  • 🚀创建存储过程:

    • -- DELIMITER关键字将SQL语句结束符号改为‘$$’,在创建存储过程后再改回‘;’
      -- 这是为了避免SQL语句的结束符号与END结束符号冲突,导致1064异常
      DELIMITER $$
      
      CREATE PROCEDURE 存储过程名称([参数列表])
      BEGIN
      	-- SQL语句
      END$$
      
      DELIMITER ;
      

  • 🚀存储过程的调用:

    • CALL 存储过程名称([参数]);
      

  • 🚀查看存储过程的信息:

    • -- 查询指定数据库的存储过程及状态信息
      SELECT * FROM INFORMATION_SCHEMA.`ROUTINES` WHERE ROUTINE_SCHEMA = '数据库名称';
      
      -- 查询某个存储过程的定义语句
      SHOW CREATE PROCEDURE 存储过程名称;
      

  • 🚀删除存储过程:

    • DROP PROCEDURE [IF EXISTS] 存储过程名称;
      



3. 变量

①系统变量

系统变量

  • 系统变量:是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)会话变量(SESSION)

  • 🚀查看系统变量:

    • #SESSION 或 GLOBAL 如果不指定,默认为SESSION
      -- 查看所有系统变量
      SHOW [SESSION | GLOBAL] VARIABLES;
      
      -- 通过LIKE模糊匹配方式查看系统变量
      SHOW [SESSION | GLOBAL] VARIABLES LIKE '....';
      
      -- 查看指定系统变量的值
      SELECT @@[SESSION | GLOBAL].系统变量名;
      
      • -- 演示
        
        -- 查看所有session级别系统变量
        SHOW VARIABLES;
        #或
        SHOW SESSION VARIABLES;
        
        -- 模糊匹配AUTO开头的系统变量
        SHOW SESSION VARIABLES LIKE 'AUTO%';
        SHOW GLOBAL VARIABLES LIKE 'AUTO%';
        
        -- 查看名为AUTOCOMMIT的系统变量
        SELECT @@GLOBAL.AUTOCOMMIT;
        SELECT @@SESSION.AUTOCOMMIT;
        

  • 🚀设置系统变量

    • #SESSION 或 GLOBAL 如果不指定,默认为SESSION
      SET [SESSION | GLOBAL] 系统变量名 = 自定义值;
      SET @@[SESSION | GLOBAL].系统变量名 = 自定义值;
      

注意

  • 设置或查看系统变量时,SESSION 或 GLOBAL 如果不指定,**默认为SESSION **。
  • MySQL服务重新启动后,所设置的全局变量都会重置,想要不失效,可以在配置文件/etc/my.cnf文件中配置。



② 用户定义变量

用户定义变量

  • 用户定义变量:是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以。其作用域为当前连接

  • 🚀用户定义变量的赋值**(4种方式)** :

    • -- var_name:用户定义变量名,由用户自定义
      -- expr:用户定义变量的值,由用户自定义
      #方式一:
      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 表名;
      

  • 🚀用户定义变量的使用:

    • -- var_name:用户定义变量名,由用户自定义
      SELECT @var_name [,@var_name...];
      

注意:用户定义的变量无需对其进行声明或初始化,不声明或初始化获取到的值为NULL。



③ 局部变量

局部变量

  • 局部变量:是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN...END块。

  • 🚀声明局部变量:

    • DECLARE 变量名 变量类型 [DEFAULT...];
      
    • 变量类型:就是数据库字段类型:INT,BIGINT,CHAR,VARCHAR,DATE,TIME等。


  • 🚀为局部变量赋值:

    • SET 变量名 =;
      SET 变量名 :=;
      SELECT 字段名 INTO 变量名 FROM 表名 WHERE 查询条件...;
      



4. 条件判断语句IF

  • 🚀 语法

    • IF 条件1 THEN
      	-- 执行逻辑
      ELSEIF 条件2 THEN   -- 可选
      	-- 执行逻辑
      ELSE               -- 可选
      	-- 执行逻辑
      END IF;	
      
      • -- 演示
        /*
        给成绩打分
        分数score >= 80 结果result就是优秀
        分数80 > score >= 60 结果result就是优秀
        分数score < 60 结果result就是不及格
        */
        DELIMITER $$
        
        CREATE PROCEDURE p3()
        BEGIN
        	DECLARE score INT DEFAULT 58;
        	DECLARE result VARCHAR(10);
        	
        	IF score >= 80 THEN
        		SET result = '优秀';
        	ELSEIF score >= 60 THEN
        		SET result = '合格';
        	ELSE
        		SET result = '不合格';
        	END IF;
        	SELECT result;
        END$$
        
        DELIMITER ;
        



5. 参数传递

参数

在这里插入图片描述


  • 🚀参数传递的用法:

    • DELIMITER $$
      
      CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGIN
      	-- SQL语句
      END$$
      
      DELIMITER ;
      
      • -- 演示
        /*
        1. 根据传入(in)参数score,判定当前分数对应的分数等级,并返回(out)
        分数score >= 80 结果result就是优秀
        分数80 > score >= 60 结果result就是优秀
        分数score < 60 结果result就是不及格
        */
        DELIMITER $$
        
        CREATE PROCEDURE p4(IN score INT,OUT result VARCHAR(10))
        BEGIN
        	IF score >= 80 THEN
        		SET result = '优秀';
        	ELSEIF score >= 60 THEN
        		SET result = '合格';
        	ELSE
        		SET result = '不合格';
        	END IF;
        END$$
        
        DELIMITER ;
        
        -- 调用存储过程,查看返回结果。
        CALL p4(100,@result);
        SELECT @result;
        
        
        -- 2. 传入两百分制数,转换为一百分制数输出(inout)
        DELIMITER $$
        
        CREATE PROCEDURE p5(INOUT score DOUBLE)
        BEGIN
        	SET score = score * 0.5;
        END$$
        
        DELIMITER ;
        
        -- 设置自定参数传入,获取转换后的参数。
        SET @score = 180;
        CALL p5(@score);
        SELECT @score;
        



6. CASE语句

  • 🚀CASE语法一:

  • 如果when_value = case_value,就会执行对应THEN后面的statement_list逻辑

    • -- 存储过程中使用CASE
      DELIMITER $$
      
      CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGIN
          CASE case_value
              WHEN when_value1 THEN statement_list1
              [WHEN when_value2 THEN statement_list2]
              [ELSE statement_list]
          END CASE;
      END$$
      
      DELIMITER ;
      

  • 🚀CASE语法二:

  • 如果search_condition的结果为TRUE,就会执行对应THEN后面的statement_list逻辑

    • -- 存储过程中使用CASE
      DELIMITER $$
      
      CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGIN
          CASE
              WHEN search_condition1 THEN statement_list1
              [WHEN search_condition2 THEN statement_list2]
              [ELSE statement_list]
          END CASE;
      END$$
      
      DELIMITER ;
      
      



7. 循环语句

①while循环

while

  • while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为:

    • -- 先判定条件,条件结果为TRUE则执行逻辑,否则不执行语句。
      WHILE 条件 DO
      	#SQL逻辑
      END WHILE;
      
    • -- 存储过程中使用WHILE
      DELIMITER $$
      
      CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGIN
          WHILE 条件 DO
              #SQL逻辑
          END WHILE;
      END$$
      
      DELIMITER ;
      



②repeat循环

repeat:

  • repeat是有条件的循环控制语句,当满足条件的时候退出循环 。具体语法为:

    • -- 先执行一次逻辑,然后判定逻辑是否为True,如果True则退出循环,不满足判定则继续循环。
      REPEAT
      	#SQL逻辑
      	UNTIL 条件
      END REPEAT;
      
    • -- 存储过程中使用REPEAT
      DELIMITER $$
      
      CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGIN
          REPEAT
              #SQL逻辑
              UNTIL 条件
          END REPEAT;
      END$$
      
      DELIMITER ;
      



③loop循环

loop

  • LOOP实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。LOOP可以配合一下两个语句使用
    • LEVEL:配合循环使用,退出循环。
    • ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。

  • 🚀loop循环语法:

    • -- begin_label: 是标记
      -- end_label 是结束标记
      [begin_label:] LOOP
      	#SQL逻辑
      END LOOP [end_label];
      
    • -- 退出指定label标记的循环体
      LEVEL label;
      
      -- 跳过本次循环,直接进入下一次循环
      ITERATE label;
      



8. 游标 和 条件处理程序

①游标 cursor

cursor

  • 游标(CURSOR)
  • 是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明OPENFETCHCLOSE

  • 🚀游标的声明:

    • DECLARE 游标名称 CURSOR FOR 查询语句;
      

  • 🚀打开游标:

    • OPEN 游标名称;
      

  • 🚀获取游标记录:

    • FETCH 游标名称 INTO 变量1[,变量2,...];
      

  • 🚀关闭游标:

    • CLOSE 游标名称;
      



②条件处理程序 Handler

Handler

  • 条件处理程序(Handler)

  • 可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤 。具体语法为:

    • -- 语法
      DECLARE handler_action HANDLER FOR
      condition_value [,condition_value,...] 
      statement;
      
      -- handler_action的解释:
      CONTINUE #继续执行当前程序
      EXIT     #终止执行当前程序
      
      -- condition_value的解释:
      SQLSTATE 'lstate_value' #状态码,如02000
      SQLWARNING		#所有01开头的SQLSTATE代码的简写
      NOT FOUND		#所有02开头的SQLSTATE代码的简写
      SQLEXCEPTION	#所有没有被SQLWARNING或NOT FOUND捕获的代码的简写
      
      -- statement解释
      /*
      程序满足condition_value就会执行handler_action,
      执行完handler_action操作后就会执行statement的操作
      */
      
      


③使用案例

  • 演示

    • – 要求:
      /*
      根据传入的参数uage,来查询用户表tb_user中,
      所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),
      并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。
      */

      – 逻辑:
      – 1.声明游标,存储查询结果集
      – 2.准备:创建表结构
      – 3.开启游标
      – 4.获取游标中的记录
      – 5.插入数据到新表
      – 6.关闭游标

    • #修改结束标志,避免代码无法正常执行完毕
      DELIMITER $$
      
      CREATE PROCEDURE p11(IN uage INT)
      BEGIN
      	#声明第4步使用的变量
      	DECLARE uname VARCHAR(50);
      	DECLARE uprofession VARCHAR(11);
      	
      	#1.声明游标,存储查询结果集
      	DECLARE u_cursor CURSOR FOR 
      	SELECT NAME,profession FROM tb_user 
      	WHERE age <= uage;
      	
      	#声明条件处理程序Handler,
      	#满足NOT FOUND就执行exit操作
      	#执行完后,关闭游标:CLOSE u_cursor。
      	-- 这个handler的目的是:若游标内没有数据,直接退出并关闭游标
      	DECLARE EXIT HANDLER FOR NOT FOUND CLOSE u_cursor;
      	
      	#2.准备:创建表结构
      	DROP TABLE IF EXISTS tb_user_pro;
      	
      	CREATE TABLE IF NOT EXISTS tb_user_pro(
      		id INT PRIMARY KEY AUTO_INCREMENT,
      		NAME VARCHAR(50) NOT NULL,
      		profession VARCHAR(11)
      	);
      	
      	#3.开启游标
      	OPEN u_cursor;
      	
      	#4.获取游标中的记录(循环)
      	WHILE TRUE DO
      		#获取游标数据存入变量
      		FETCH u_cursor INTO uname,uprofession;
      		#5.插入数据到新表
      		INSERT INTO tb_user_pro VALUES(NULL,uname,uprofession);
      		
      	END WHILE;
      	
      	#6.关闭游标
      	CLOSE u_cursor;
      END$$
      
      #恢复原本的结束标志
      DELIMITER ; 
      
      -- 调用存储过程
      CALL P11(60);
      -- 查看是新表否达到要求
      SELECT * FROM tb_user_pro;
      



9. 存储函数

存储函数

  • 存储函数是有返回值的存储过程,存储函数的参数只能是IN类型。

  • 🚀存储函数的使用:

    • -- 语法:
      DELIMITER $$
      
      CREATE FUNCTION 存储函数名称([参数列表])
      RETURNS type [characteristic...]
      BEGIN
      	-- SQL语句
      	RETURN...;
      END $$
      
      DELIMITER ;
      
      #######################################
      
      -- characteristic的解释:
      DETERMINISTIC  #相同的输入参数总是产生相同的结果
      NO SQL         #不包含SQL语句
      READS SQL DATA #包含读取数据的语句,但不包含写入数据的语句。
      

  • 演示

    • 使用存储函数,实现从1到n的累加

    • -- 使用存储函数,实现从1到n的累加
      DELIMITER $$
      
      CREATE FUNCTION f(n INT)
      RETURNS INT DETERMINISTIC
      BEGIN
      	-- SQL语句
      	DECLARE total INT DEFAULT 0;
      	
      	WHILE n > 0 DO
      		SET total = total + n;
      		SET n = n - 1;
      	END WHILE;
      	
      	-- 返回
      	RETURN total;
      END $$
      
      DELIMITER ;
      
      -- 验证结果
      SELECT f(100);
      




在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【kafka】使用docker启动kafka

1.环境准备 docker拉取zookeeper镜像 docker pull zookeeper:3.4.14 创建zookeeper容器&#xff0c;默认端口号为2181 docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14 拉取kafka镜像 docker pull wurstmeister/kafka:2.12-2.3.1 创键kafka容器&#xff…

Linux | C语言中volatile关键字的理解

目录 前言 一、代码引入 二、现象解释 三、具体引用 前言 本章主要讲解介绍volatile关键的作用与使用场合&#xff1b;深刻理解volatile关键字&#xff1b;本文你需要有信号相关的基础知识&#xff1b; Linux | 信号-CSDN博客 一、代码引入 首先&#xff0c;我们来查看下面…

【文末附资料链接】2023年第十三届亚太杯数学建模竞赛(APMCM)优秀参考论文思路指导(持续更新中ing)

一、赛事介绍 数学建模作为一门跨学科的科学&#xff0c;不仅需要对数学知识的熟练掌握&#xff0c;还需要对实际问题的深刻理解和解决问题的创新思维。亚太杯数学建模竞赛旨在激发青年学子的创造力和团队协作精神&#xff0c;培养其在实际问题中运用数学方法解决现实挑战的能力…

介绍交换空间概念以及如何设置交换空间

文章目录 什么交换空间新增交换空间 什么交换空间 交换空间&#xff08;Swap space&#xff09;是计算机内存的一种补充&#xff0c;位于硬盘驱动器上。当物理内存不足时&#xff0c;系统会将不活跃的页面移到交换空间中。 交换空间可以帮助系统在以下情况下运行&#xff1a…

devops底层是怎么实现的

DevOps的3大核心基础架构 简而言之&#xff0c;实现DevOps工具链&#xff0c;基本需要3个核心基础架构&#xff1a; SCM配置管理系统 Automation自动化系统 Cloud云&#xff08;或者说可伸缩的、自服务的、虚拟化系统&#xff09; SCM配置管理系统 SCM中所放置的内容又可以再…

[ 一刷完结撒花!! ] Day50 力扣单调栈 : 503.下一个更大元素II |42. 接雨水 | 84.柱状图中最大的矩形

Day50 力扣单调栈 : 503.下一个更大元素II &#xff5c;42. 接雨水 | 84.柱状图中最大的矩形 503.下一个更大元素II第一印象看完题解的思路实现中的困难感悟代码 42. 接雨水第一印象看完题解的思路暴力解法单调栈解法 实现中的困难感悟代码 84.柱状图中最大的矩形第一印象看完…

计算机视觉与机器学习D1

计算机视觉简介 技术背景 了解人工智能方向、热点 目前人工智能的技术方向有&#xff1a; 1、计算机视觉——计算机视觉(CV)是指机器感知环境的能力&#xff1b;这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。物体检测和人脸识别是其比较成功…

Ubuntu20.04 安装微信 【wine方式安装】推荐

安装步骤: 第一步:安装 WineHQ 安装包 先安装wine,根据官网指导安装即可。下载 - WineHQ Wikihttps://wiki.winehq.org/Download_zhcn 如果您之前安装过来自其他仓库的 Wine 安装包,请在尝试安装 WineHQ 安装包之前删除它及依赖它的所有安装包(如:wine-mono、wine-gec…

深度学习二维码识别 计算机竞赛

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

C++多线程编程(1):线程的创建方式

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 进行与线程C中如何实现多线程创建线程的多种方式无参函数lambda表达式常成员函数not常成员引用函数智能指针仿函数类的普通成员函数综合测试 进行与线程 多线程是指多个线程并发执行的过程。 进程与线程的关系&…

使用Qt实现多人聊天工作室

目录 1、项目背景 2、技术分析 3、架构设计 3、1 服务器架构 3.1.1 模块划分 3.1.2 模块之间的交互 3、2 客户端架构 3.2.1 模块划分 3.2.2 模块之间交互 4、实现过程 4、1 功能实现 4.1.1 用户登录注册功能​编辑 4.1.2 用户主界面功能 4、2 设计实现 4.2.1 登录…

传输层协议-TCP协议

目录 TCP协议格式理解可靠性序号与确认序号16位窗口大小六个标志位连接管理机制三次握手四次挥手 确认应答机制&#xff08;ACK&#xff09;超时空重传机制流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP应用层协议TCP/UDP对比用UDP实现…

程序的编译链接以及装载

目录 一、预处理 二、编译 三、汇编 四、链接 五、装载 一、预处理 读取c源程序&#xff0c;对其中的伪指令&#xff08;以#开头的指令&#xff09;和特殊符号进行处理&#xff0c; 伪指令主要包括以下五个方面&#xff1a; 宏定义指令&#xff0c;如#define Name Token…

如何定位el-tree中的树节点当父元素滚动时如何定位子元素

使用到的方法 Element 接口的 scrollIntoView() 方法会滚动元素的父容器&#xff0c;使被调用 scrollIntoView() 的元素对用户可见。 参数 alignToTop可选 一个布尔值&#xff1a; 如果为 true&#xff0c;元素的顶端将和其所在滚动区的可视区域的顶端对齐。相应的 scrollIntoV…

基于冠状病毒群体免疫算法优化概率神经网络PNN的分类预测 - 附代码

基于冠状病毒群体免疫算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于冠状病毒群体免疫算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于冠状病毒群体免疫优化的PNN网络5.测试结果6.参考文献7.Matlab代码 …

再高级的打工人也只是打工人!

再高级的打工人也只是打工人&#xff01; OpenAI CEO 奥特曼被罢免的事情人尽皆知「虽然&#xff0c;今天又复职了。。」&#xff0c;我们能从中学到什么呢&#xff1f; CEO 也能被裁&#xff0c;这应该是最近几年被裁名单里面&#xff0c;职级最高的一个人了吧。你再也不用担…

2023最新最全【Nacos】零基础安装教程

一、下载Nacos1.4.1 二、单机版本安装 2.1 将下载的nacos安装包传输到服务器2.2 解压文件2.3 进入bin目录下 单机版本启动2.4 关闭nacos2.5 访问Nacos地址 IP&#xff1a;8848/nacos 三、集群版本的安装 3.1 复制nacos安装包&#xff0c;修改为nacos8849&#xff0c;nacos88…

cesium 图片旋转

cesium 图片旋转 1、实现思路 用cesium 中 ellipse 方法来加载圆型&#xff0c;改变 material 材质 用 ImageMaterialProperty 属性来加在图片&#xff0c;实时改变rotation&#xff0c;stRotation属性来实现旋转 2、源码实现 <!DOCTYPE html> <html lang"en&…

自定义业务异常处理类加入全局处理器中

自定义业务异常处理类并将其加入全局异常处理器&#xff0c;从而避免业务层直接处理异常造成代码污染&#xff0c;达到业务清晰简洁。 描述 在进行分类模块开发时&#xff0c;删除某个分类时当分类关联了菜品和套餐时&#xff0c;是不允许删除的。我们在管理端删除的时候会提示…

lectin

PSGL-1 ; selectin O-linked glycosylation | Detailed Pedia PSGL-1 has several O-glycans to extend the ligand away from the cell surface. An sLex epitope allows interactions with the receptor for leukocyte localisation. 分类 --Recognition by Animal Lectins…