⑩⑤【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()
        BEGINDECLARE score INT DEFAULT 58;DECLARE result VARCHAR(10);IF score >= 80 THENSET result = '优秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET 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))
        BEGINIF score >= 80 THENSET result = '优秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET result = '不合格';END IF;
        END$$DELIMITER ;-- 调用存储过程,查看返回结果。
        CALL p4(100,@result);
        SELECT @result;-- 2. 传入两百分制数,转换为一百分制数输出(inout)
        DELIMITER $$CREATE PROCEDURE p5(INOUT score DOUBLE)
        BEGINSET 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 参数名 参数类型])
      BEGINCASE case_valueWHEN 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 参数名 参数类型])
      BEGINCASEWHEN 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 参数名 参数类型])
      BEGINWHILE 条件 DO#SQL逻辑END WHILE;
      END$$DELIMITER ;
      



②repeat循环

repeat:

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

    • -- 先执行一次逻辑,然后判定逻辑是否为True,如果True则退出循环,不满足判定则继续循环。
      REPEAT#SQL逻辑UNTIL 条件
      END REPEAT;
      
    • -- 存储过程中使用REPEAT
      DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGINREPEAT#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 DOSET total = total + n;SET n = n - 1;END WHILE;-- 返回RETURN total;
      END $$DELIMITER ;-- 验证结果
      SELECT f(100);
      




在这里插入图片描述

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

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

相关文章

Polygon zkEVM协议治理、升级及其流程

1. 引言 随着Polygon社区开发者和内部团队的测试深入&#xff0c;当前版本的Polygon zkEVM不可避免地需更新和某些升级。 为激励开发者对Polygon zkEVM做battle-test&#xff0c;已启动了bug-bounty&#xff1a; Rewards by Threat Level 由于zk-Rollup生态系统还处于萌芽阶…

【libGDX】ApplicationAdapter生命周期

1 前言 libGDX 中&#xff0c;用户自定义的渲染窗口需要继承 ApplicationAdapter 类&#xff0c;ApplicationAdapter 实现了 ApplicationListener 接口&#xff0c;但实现的方法都是空方法&#xff0c;方法释义如下。 public interface ApplicationListener {// 应用首次创建时…

sql注入 [极客大挑战 2019]HardSQL1

打开题目 输入1或者1"&#xff0c;页面均回显NO,Wrong username password&#xff01;&#xff01;&#xff01; 那我们输入1 试试万能密码 1 or 11 # 输入1 and 12 # 输入1 union select 1,2,3 # 输入1 ununionion seselectlect 1,2,3 # 输入1 # 输入1# 页面依旧回…

transformer学习资料

一、NLP 自然语言处理 NLP 是机器学习在语言学领域的研究&#xff0c;专注于理解与人类语言相关的一切。NLP 的目标不仅是要理解每个单独的单词含义&#xff0c;而且也要理解这些单词与之相关联的上下文之间的意思。 常见的NLP 任务列表&#xff1a; 对整句的分类&#xff1…

Vue.js2+Cesium1.103.0 十四、绘制视锥,并可实时调整视锥姿态

Vue.js2Cesium1.103.0 十四、绘制视锥&#xff0c;并可实时调整视锥姿态 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"><divclass"control"style"position: absolute;right: 50px;top: 50px…

基于51单片机水位监测控制报警仿真设计( proteus仿真+程序+设计报告+讲解视频)

这里写目录标题 &#x1f4a5;1. 主要功能&#xff1a;&#x1f4a5;2. 讲解视频&#xff1a;&#x1f4a5;3. 仿真&#x1f4a5;4. 程序代码&#x1f4a5;5. 设计报告&#x1f4a5;6. 设计资料内容清单&&下载链接&#x1f4a5;[资料下载链接&#xff1a;](https://doc…

NX二次开发UF_CAM_ask_f_s_db_object 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_f_s_db_object Defined in: uf_cam.h int UF_CAM_ask_f_s_db_object(UF_CAM_db_object_t * db_obj ) overview 概述 This function provides the database object which is currently u…

yum仓库

目录 什么是yum仓库 概念 yum的实现过程 Yum的实现过程如下&#xff1a; yum的配置文件 仓库设置文件 日志文件 yum命令 yum list 显示所有可用的包&#xff0c;包名&#xff0c;支持通配符 yum list*Kernel yum info 显示包的信息 yum search ftp 查…

【Feign】 基于 Feign 远程调用、 自定义配置、性能优化、实现 Feign 最佳实践

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; SpringCloud MybatisPlus JVM 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Feign 一、 基于 Feign 远程调用1.1 RestTemplate方式…

笔记53:torch.nn.rnn() 函数详解

参数解释&#xff1a; &#xff08;1&#xff09;input_size()&#xff1a;即输入信息 Xt 的每个序列的独热编码向量的长度&#xff0c;即 len(vocab) &#xff08;2&#xff09;hidden_size()&#xff1a;即隐变量 h 的维度&#xff08;维度是多少&#xff0c;就代表用几个数…

Keras训练一个基本体系化的分类模型流程案例

Keras训练一个基本体系化的分类模型流程案例 import numpy as np from keras.datasets import mnist from keras.utils import np_utils # 导入keras提供的numpy工具包 from keras.models import Sequential from keras.layers import Dense from keras.optimizers impo…

unity 打包exe设置分辨率

unity在2019以上版本不支持在打开的时候弹出分辨率设置的窗口&#xff0c;但是因为有些需求需要可以设置分辨率进行操作&#xff0c;我在查了好多办法后找到了解决方案&#xff0c;废话不多说开始干货。 1.先去百度云上下载这个文件 链接&#xff1a;https://pan.baidu.com/s/1…

LeetCode Hot100之十:239.滑动窗口最大值

题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 提示&#xff1a; 1 < nums.length < 10^5 -10^4 < nums[i…

BUG 随想录 - Java: 程序包 com.example.xxx 不存在

目录 一、BUG 复现 二、解决问题 一、BUG 复现 背景&#xff1a;通过 feign 的最佳实践&#xff0c;将 feign 单独提取成一个微服务&#xff0c;接着在需要远程调用的微服务中引入 feign 模块&#xff0c;并在启动类通过 EnableFeignClients 声明指定的 Feign 客户端. 出现问题…

LENOVO联想ThinkBook 16p G2 ACH(20YM)2022款锐龙版原厂Win11预装系统镜像

链接&#xff1a;https://pan.baidu.com/s/14AATH2NYsLwK9jMpej2BNw?pwd53sy 提取码&#xff1a;53sy 原装出厂W11系统自带网卡、显卡、声卡、蓝牙等所有驱动、出厂时状态主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格…

面试官:你能说说常见的前端加密方法吗?

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 前言 本篇文章略微介绍一下前端中常见的加密算法。前端中常见的加密算法主要形式包括——哈希函数&#xff0c;对称…

十八数藏的文化新生:数字创新的非遗保护之光

在数字时代的大舞台上&#xff0c;十八数藏如一颗璀璨的文化新星&#xff0c;以数字创新的光芒点亮着非遗保护的未来。这不仅仅是一次文化的复兴&#xff0c;更是对传统之美的数字赋能&#xff0c;让非遗在新的时代焕发出勃勃生机。 十八数藏通过数字化手段&#xff0c;使得传统…

AppLink定时调度操作

RestCloud AppLink定时调度操作 定时调度可以让我们更加快速了解到数据的变动以作出更好的决策&#xff0c;接下来通过AppLink平台配置定时调度的操作。 1.登录RestCloud AppLink 2.点击授权管理 3.点击应用认证菜单 4.新建拼多多授权认证 基础定时调度配置 1.拉取一个定时器…

Linux CentOS7 添加网卡

一台主机中安装多块网卡&#xff0c;有许多优势。可以实现多项功能。 为了学习网卡参数的设置&#xff0c;可以为主机添加多块网卡。与添加磁盘一样&#xff0c;要在VMware中设置。利用图形化方式或命令行查看或设置网卡。本文仅初步讨论添加、查看与删除网卡&#xff0c;有关…

Go——一、Go语言安装及介绍

Go 一、Windows下安装Go1、下载Go2、配置环境变量3、下载Jetbrain下的GoLang4、编写hello world5、编译和执行 二、Go语言介绍1、开发文档2、Go语言核心开发团队3、为什么要创建Go4、Go语言发展史5、Go语言特点6、Golang执行过程6.1 执行过程分析6.2 编译是什么 7、开发注意事项…