MySQL:进阶巩固-存储过程

目录

    • 一、存储过程的概述
    • 二、存储过程的基本使用
      • 2.1 创建存储过程
      • 2.2 使用存储过程
      • 2.3 查询指定数据库的存储过程以及状态信息
      • 2.4 查看某个存储过程的定义
      • 2.5 删除存储过程
      • 2.6 案例
    • 三、存储过程的变量设置
      • 3.1 系统变量
      • 3.2 用户自定义变量
      • 3.3 局部变量
    • 四、IF判断
    • 五、参数
    • 六、CASE判断
    • 七、While循环
    • 八、repeat循环
    • 九、loop循环
    • 十、游标
    • 十一、条件处理程序


在这里插入图片描述

一、存储过程的概述

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

特点:

  • 封装、复用
  • 可以接收参数,也可以返回数据
  • 减少网络交互,提高效率

二、存储过程的基本使用

2.1 创建存储过程

CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN-- SQL语句
END;

2.2 使用存储过程

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

2.3 查询指定数据库的存储过程以及状态信息

SELECT * FROM information_schema.routines WHERE routine_schema=数据库名称;

2.4 查看某个存储过程的定义

SHOW CREATE PROCEDURE 存储过程名称;

2.5 删除存储过程

DROP PROCEDURE IF EXISTS 存储过程名称;

2.6 案例

-- 创建存储过程
CREATE PROCEDURE p1()
BEGINSELECT COUNT(*) 人员数量 FROM tb_emp;
END;
-- 调用存储过程
CALL p1();
-- 查询指令数据库的存储过程以及状态信息
SELECT * FROM information_schema.routines WHERE routine_schema='mysql_demo';
-- 查看某个存储过程的定义
SHOW CREATE PROCEDURE p1;
-- 删除存储过程
DROP PROCEDURE IF EXISTS p1;

注意:在命令行中,执行创建存储过程的SQL时,需要通过关键字delimiter指定SQL语句的结束符。

delimiter $$

指定delimiter之后,SQL语句的结束符就是$$,之后还需要在更改回来

delimiter ;

三、存储过程的变量设置

3.1 系统变量

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

查看所有系统变量

SHOW [SESSION|GLOBAL] VARIABLES;

LIKE模糊匹配查找变量

SHOW [SESSION|GLOBAL] VARIABLES LIKE '......';

查看指定变量的值

SELECT @@[SESSION|GLOBAL].系统变量名; 

设置系统变量

SET [SESSION|GLOBAL] 系统变量名=;SET @@[SESSION|GLOBAL] 系统变量名=;

注意:
1. 如果没有指定SESSION|GLOBAL,默认是SESSION,绘画变量。
2. MySQL服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在/etc/my.cnf中配置

3.2 用户自定义变量

用户自定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用"@变量名"使用即可。其作用域是当前会话(SESSION)。

赋值

SET @var_name = expr;SET @var_name := expr;  // 推荐使用SELECT @var_name := expr;SELECT 字段名 INTO @var_name FROM 表名;

使用

SELECT @var_name;
SET @myname = '张三';
SET @myage = '18';
SET @mygender = '男';
SET @myhobby = '篮球';SELECT @myname,@myage,@mygender,@myhobby;

注意:如果查询没有定义的变量,他不会报错,只不过获取到的值为NULL

3.3 局部变量

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

声明

DECLARE 变量名 变量类型[DEFAULT...];

变量类型就是数据库字段类型:INT、BEGIN、CHAR、VARCHAR、DATE、TIME等
赋值

SET 变量名 =;
SET 变量名 :=;SELECT 字段名 INTO 变量名 FROM 表名...;
CREATE PROCEDURE p2()
BEGINDECLARE stu_count int DEFAULT 0;SELECT COUNT(*) INTO stu_count FROM tb_user;SELECT stu_count;
END;CALL p2();

查询

SELECT 局部变量名;

四、IF判断

IF 条件 THEN...
ELSEIF 条件2 THEN...
ELSE ...
END IF;
CREATE PROCEDURE p3()
BEGINDECLARE age int DEFAULT 18;DECLARE result VARCHAR(10);IF age < 18 THENSET result := '小孩';ELSEIF age >=18 AND age <= 35 THENSET result := '青年';ELSESET result := '老年';END IF;SELECT result;
END;CALL p3();

五、参数

类型含义备注
IN输入参数默认
OUT输出参数
INOUT输入、输出参数

语法

CREATE PROCEDURE 存储过程名称([IN/OUT/INOUT 参数名 参数类型])
BEGIN....
END;

输入参数与输出参数

CREATE PROCEDURE P4(IN age INT, OUT result VARCHAR(10))
BEGINIF age < 18 THENSET result := '小孩';ELSEIF age >=18 AND age <= 35 THENSET result := '青年';ELSESET result := '老年';END IF;
END;
-- 执行存储过程
CALL p4(18, @result);
-- 查看返回结果
SELECT @result;

输入、输出参数

CREATE PROCEDURE p5(INOUT score DOUBLE)
BEGINSET score := score * 0.5;
END;SET @score = 80;
CALL p5(@score);
SELECT @score;

六、CASE判断

语法一:

CASE case_valueWHEN when_value1 THEN statement_list1WHEN when_value2 THEN statement_list2...ELSE statement_list
END CASE;

语法二:

CASEWHEN search_condition1 THEN statement_list1WHEN search_condition2 THEN statement_list2...ELSE statement_list
END CASE;
-- 根据传入的月份,判断月份所属的季节
-- 1-3月份 第一季度
-- 4-6月份 第二季度
-- 7-9月份 第三季度
-- 10-12月份 第四季度
CREATE PROCEDURE p6(IN month INT, OUT result VARCHAR(10))
BEGINCASE WHEN month >= 1 AND month <=3 THENSET result := '第一季度';WHEN month >= 4 AND month <=6 THENSET result := '第二季度';WHEN month >= 7 AND month <=9 THENSET result := '第三季度';WHEN month >= 10 AND month <=12 THENSET result := '第三季度';ELSESET result := '你家有这个月份啊!';END CASE;
END;SET @month := 6;
CALL p6(@month, @result);
SELECT CONCAT('您输入的月份为:', @month, ' 所属季度为:', @result)

七、While循环

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

# 先判断条件,如果条件为True,则执行逻辑,否则不执行逻辑
WHILE 条件 DOSQL逻辑
END WHILE;
-- 计算从1累加到N的值
CREATE PROCEDURE p3(IN n INT, OUT total INT)
BEGINDECLARE result int DEFAULT 0;WHILE n > 0 DOSET result := result + n;SET n := n - 1; END WHILE;SET total := result;
END;SET @n := 10;
CALL p3(@n, @total);SELECT @total;

注意:WHILE中使用OUT变量输出为NULL,如果想要输出,可以先定义一个局部变量最后计算完成之后在设置输出变量。

八、repeat循环

repeat循环是有条件的循环控制语句。满足条件后,退出循环

# 先执行一次逻辑,然后判断逻辑是否满足,如果满足则退出,如果不满足,则继续下一个循环。
REPEAT SQL逻辑UNTIL 条件
END REPEAT
-- 计算从1累加到N的值
CREATE PROCEDURE p4(IN n INT, OUT total INT)
BEGINDECLARE result int DEFAULT 0;REPEATSET result := result + n;SET n := n - 1; UNTIL n <= 0 END REPEAT;SET total := result;
END;SET @n := 10;
CALL p4(@n, @total);SELECT @total;

九、loop循环

LOOP实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用来实现简单的死循环。
LOOP可以配合两个语句一起使用:

  • LEAVE: 配合循环使用,退出循环
  • ITERATE:必须用在循环中,跳过本次循环执行下一次循环
[begin_label] LOOPSQL逻辑
END LOOP [end_label];
LEAVE label; -- 退出循环
ITERATE label;  -- 退出本次循环执行下一次循环
CREATE PROCEDURE p5(IN n INT, OUT total INT)
BEGINDECLARE result int DEFAULT 0;sum:LOOPIF n <= 0 THEN LEAVE sum; END IF;SET result := result + n;SET n := n - 1; END LOOP sum;SET total := result;
END;SET @n := 10;
CALL p5(@n, @total);SELECT @total;
CREATE PROCEDURE p6(IN n INT, OUT total INT)
BEGINDECLARE result int DEFAULT 0;sum:LOOPIF n <= 0 THEN LEAVE sum; END IF;IF n%2 = 1 THEN SET n := n - 1; ITERATE sum; END IF;SET result := result + n;SET n := n - 1; END LOOP sum;SET total := result;
END;SET @n := 10;
CALL p6(@n, @total);SELECT @total;

十、游标

游标(CURSOR)用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环处理。游标的使用包括游标的声明、OPEN(打开)、FETCH(获取)和关闭(CLOSE)。

声明游标

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

打开游标

OPEN 游标名称;

获取游标记录

FETCH 游标名称 INTO 变量;

关闭游标

CLOSE 游标名称;
-- 根据年龄查询用户数据,并将用户名跟专业插入到新表中
CREATE PROCEDURE p1(IN uage INT)
BEGIN-- 注意:变量一定要声明在游标之前DECLARE uname VARCHAR(50);DECLARE uprof VARCHAR(50);DECLARE u_cursor CURSOR FOR SELECT name,profession FROM tb_user WHERE age <= uage;DROP TABLE IF EXISTS tb_user_pro;CREATE TABLE IF NOT EXISTS tb_user_pro(id int PRIMARY KEY auto_increment,name VARCHAR(50) COMMENT '姓名',profession VARCHAR(50) COMMENT '专业');OPEN u_cursor;WHILE TRUE DOFETCH u_cursor INTO uname,uprof;INSERT tb_user_pro(name, profession) VALUES(uname,uprof);END WHILE;CLOSE u_cursor;
END;CALL p1(35);

十一、条件处理程序

条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。

DECLARE handler_action HANDLER FRO condition_value [, condition_value] ... statement;handler_action CONTINUE: 继续执行当前程序EXIT: 终止执行当前程序
condition_value SQLSTATE sqlstate_value: 状态码,如 02000SQLWARNING: 所有以01开头的SQLSTATE代码的简写NOT FOUND: 所有以02开头的SQLSTATE代码的简写SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND 捕获的SQLSTATE代码的简写
-- 根据年龄查询用户数据,并将用户名跟专业插入到新表中
CREATE PROCEDURE p2(IN uage INT)
BEGINDECLARE uname VARCHAR(50);DECLARE uprof VARCHAR(50);DECLARE u_cursor CURSOR FOR SELECT name,profession FROM tb_user WHERE age <= uage;DECLARE EXIT HANDLER FOR NOT FOUND CLOSE u_cursor;DROP TABLE IF EXISTS tb_user_pro;CREATE TABLE IF NOT EXISTS tb_user_pro(id int PRIMARY KEY auto_increment,name VARCHAR(50) COMMENT '姓名',profession VARCHAR(50) COMMENT '专业');OPEN u_cursor;WHILE TRUE DOFETCH u_cursor INTO uname,uprof;INSERT tb_user_pro(name, profession) VALUES(uname,uprof);END WHILE;CLOSE u_cursor;
END;CALL p2(35);

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析、数学模型及Python代码

2024年中国研究生数学建模竞赛 E题&#xff1a;高速公路应急车道紧急启用模型 问题分析 更新进展 【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 E题&#xff1a;高速公路应急车道紧急启用…

物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总

物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意&#xff1a;ESP-01sWIFI模块&#xff0c;去搜了一下这个小东西很有玩点&#xff0c;远程控制LED啥的&#xff0c;然后我就想…

多校园信息付费发布顶置自定义表单小程序开源版开发

多校园信息付费发布顶置自定义表单小程序开源版开发 为校园管理和互动提供了强大的支持&#xff0c;包括用户端和运营后台两大部分。用户端允许学生和教职工方便地访问各种功能模块&#xff0c;而运营后台则使管理员能够高效地管理和配置系统。产品支持自定义模块和表单&#…

CUDA编程三、C++和cuda实现矩阵乘法SGEMM

目录 一、矩阵SGEMM 二、SGEMM的各种实现 1、cpu版本的实现 2、GPU并行计算最初始的版本 GPU中数据的移动 3、矩阵分块Shared Memory优化 4、LDS.128 float4* 优化 5、__syncthreads()位置优化 6、blank conflict优化 bank概念 bank conflict bank conflict危害和处…

c++ 继承 和 组合

目录 一. 继承 1.1 继承的概念 1.2 继承定义 1.3 继承类模板 1.4. 继承中的作用域 二. 派生类&#xff08;子类&#xff09;的默认成员函数 2.1 概念&#xff1a; 2.2 实现⼀个不能被继承的类 2.3 继承与友元 2.4继承与静态成员 三.多继承及其菱形继承问题 3.1继承方…

yolov10算法原理

文章目录 1. 模型效果2. 模型特点2.1 无NMS训练的一致性双重分配策略 (Consistent Dual Assignments for NMS-free Training)双重标签分配 (Dual Label Assignments)一致匹配度量&#xff08;Consistent Match. Metric&#xff09;一对一分配在一对多结果中的频率 2.2. 效率-准…

电场(electric-field)

图中&#xff1a; Q 产生电场的正电荷&#xff08;可正可负&#xff0c;这里用正举例&#xff09;q 试验电荷&#xff0c;正电荷&#xff08;习惯上用正电荷&#xff09;p 试验电荷所在的位置&#xff08;即要测的电场强度的位置&#xff09;r 为电荷间的距离 r ^ \widehat{r}…

[js逆向学习] fastmoss电商网站——店铺排名

逆向目标 网站&#xff1a;https://www.fastmoss.com/shop-marketing/tiktok接口&#xff1a;https://www.fastmoss.com/api/shop/shopList/参数&#xff1a;fm-sign 逆向分析 我们今天要分析的是店铺排名&#xff0c;先分析网络请求&#xff0c;找到目标接口 按照上图操作…

怎样批量对比两个数据库的表差异??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

38.重复的子字符串

方法1&#xff1a; class Solution {public boolean repeatedSubstringPattern(String s) {if (s.equals("")) return false;String s2(ss).substring(1,(ss).length()-1);//去掉首尾字符return s2.contains(s);//判断是否包含s} } class Solution(object):def rep…

spring boot项目对接人大金仓

先确认一下依赖 第一 是否引入了mybatis-plus多数据源&#xff0c;如果引入了请将版本保持在3.5.0以上 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${dynam…

接触器和复合开关的具体应用区别

接触器和复合开关在电力系统中都有各自的应用&#xff0c;但它们的功能和用途有所不同&#xff1a; 一、接触器 1、应用&#xff1a; 电动机控制&#xff1a;接触器常用于控制电动机的启停&#xff0c;能够承载电动机的启动电流。 自动控制系统&#xff1a;在自动化控制系统…

2-102基于matlab的蒙特卡洛仿真

基于matlab的蒙特卡洛仿真&#xff0c;对64QAM和BPSK进行蒙特卡洛仿真&#xff0c;并绘出误码率曲线。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a; 2-102基于matlab的蒙特卡洛仿真

【FPGA必知必会】(二)7系列的配置(一)

配置概述 7系列FPGA是通过将bitstream下载到内存中来实现配置的。 既可以通过外部非易失性存储器加载&#xff0c;也可以通过微处理器、DSP处理器、微控制器、PC或者板级测试仪进行加载。 有两种通用的配置路径&#xff0c;一种是串行数据路径&#xff0c;用于减少对器件引脚…

数据丢失不再怕!四款神器助你找回一切

哈喽&#xff0c;大家好&#xff01;今天咱们来聊聊数据恢复工具&#xff1b;在数字化的时代&#xff0c;数据丢失可是个让人头疼的问题&#xff1b;不过别担心&#xff0c;有了这些数据恢复工具&#xff0c;再也不用担心数据不见&#xff1b;下面我给大家推荐五款非常好用的数…

【systemctl start jenkins】启动报错问题解决

问题说明&#xff0c;最终是在jenkins.service中配置JAVA_HOME解决的&#xff0c;但是我的服务器环境中确定已经配置好了Java环境变量&#xff0c;并且java -version也能正常打印信息&#xff0c;不清楚为什么jenkins.service无法读取配置 1.环境配置说明 服务器&#xff1a;…

如何确定SAP 某些凭证或者单号的号码编码范围的 OBJECT 是什么?

在SAP的运维或者项目实施中&#xff0c;有时会如何确定SAP 某些凭证或者单号的号码 OBJECT 是什么&#xff1f; 一般一下常用的可以通过事务代码 例如&#xff1a; XDN1 Create Number Ranges for Customer Accounts&#xff0c;定义客户编码FBN1查看维护会计凭证号范围 我…

破解 oklink 网站加密数据(升级版)

大家好!我是炒青椒不放辣,关注我,收看每期的编程干货。 逆向是爬虫工程师进阶必备技能,当我们遇到一个问题时可能会有多种解决途径,而如何做出最高效的抉择又需要经验的积累。本期文章将以实战的方式,带你详细地分析并破解 oklink 网站加密数据 特别声明:本篇文章仅供学…

屏幕演示工具 | 水豚鼠标助手 v1.0.7

水豚鼠标助手是一款功能强大的屏幕演示工具&#xff0c;专为Windows 10及以上系统设计。这款软件提供了多种实用功能&#xff0c;旨在增强用户的屏幕演示体验&#xff0c;特别适合教师、讲师和需要进行屏幕演示的用户。鼠标换肤&#xff1a;软件提供多种鼠标光标样式&#xff0…

深兰科技陈海波应邀出席2024长三角论坛暨虹桥人才创新发展大会

近日&#xff0c;以“人才引领 联动共融——国际化创新与长三角协同”为主题的“2024长三角人才发展论坛暨虹桥人才创新发展大会”在上海国际会议中心隆重举行。上海市委常委、组织部部长、市委人才办主任张为应邀出席并做大会致辞。 深兰科技创始人、董事长陈海波作为特邀企业…