MySQL存储过程

2023-10-29

MySQL存储过程

线上程序有时候出现问题导致数据错误的时候,如果比较着急,我们可以写一个存储来快速修复这块的数据,(开发中最常见的方式)

存储过程相对与Java开发来说,可以并不是太好维护以及阅读的,所以不建议在程序中去调用存储过程做一些业务操作,

准备数据

-- 如果有test库就删除test库
drop database if exists test;
-- 创建test库
create database test;
-- 如果有t_user进行删除
drop table if exists t_user;
create table t_user(
    id int not null primary key comment '编号',
    age smallint not null comment '年龄',
    name varchar(20) not null comment '姓名'
)collate = utf8mb4_bin charset = utf8mb4 engine = InnoDB;

存储过程

概念

一组预编译好的sql语句集合,理解为批处理语句

好处

  • 提高代码的重用性
  • 简化操作
  • 减少编译次数并且减少和数据库服务器连接的次数,提高效率

创建存储过程

create procedure 存储过程的名字([参数模式] 参数名 参数类型)
begin 	
	存储过程体
end

参数模式:

  • in: 参数可以作为输入,也就是参数需要调用方传入值
  • out:参数可以作为输出,也就是该参数可以作为返回值
  • inout:该参数可以作为输入也可以作为输出,也就是说该参数需要在调用的时候传入值,也可以作为返回值,

参数模式默认为in;

一个存储过程可以有多个输入,多个输出,多个输入输出参数。

调用参数过程

call 存储过程名称(参数列表)

删除存储过程

drop procedure [if exists] 存储过程名称;

删除过程只能一个一个删除,不能批量删除

修改存储过程

存储过程不能修改,如果说涉及到,可以先删除,在重建

查看存储过程

show create procedure 存储过程名称;

示例:

示例1:空参列表

创建存储过程

-- 设置结束符号$
delimiter $
-- 创建存储过程
create procedure pro1()
    begin
        insert into t_user values (1,18,'张三');
        insert into t_user values (2,20,'李四');
    end $

delimiter用来设置结束符,当mysql执行脚本的时候,会遇到结束符的时候,此处会用到delimiter

调取存储过程:

call pro1();

验证结果:

select id, age, name from t_user;

存储过程调用成功,t_user表成功插入2条数据

在这里插入图片描述

示例2:带in参数的存储过程

创建存储过程:

-- 设置结束符号$
delimiter $
-- 创建存储过程
create procedure pro2(id int,age int,in  name varchar(20))
    begin
        insert into t_user values (id,age,name);
    end $

调用存储过程:

-- 创建三个自定义变量
select @id:=3,@age:=23,@name:='wangwu';
-- 调用存储过程
call pro2(@id,@age,@name);

验证结果;

在这里插入图片描述

示例3:带out参数的存储过程
聚合函数查询
聚合函数又名组函数,常用来对表中的数据进行统计和技术,
   常用的聚合函数
  - count:表示求指定的列的总数
  - max:表示求指定的最大值
  - min:表示求指定的最小值
  - sum:表示求指定列的和
  - avg:表示求指定列的平均值
-- 设置结束符$
delimiter $
-- 创建存储过程
create procedure pro3(out t_user_count int ,out max_age int )
    begin
        select count(*),max(age) into t_user_count,max_age from t_user;
    end $

调用存储过程

-- 调用存储过程
call p4(@t_user_count,@max_age);

验证结果:

select @t_user_count,@max_age;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-URAILGKF-1678937506721)(MySQL存储过程.assets/image-20230316113046016.png)]

·

示例4:带out参数的存储过程

创建存储过程

-- 设置结束符$
delimiter $
-- 创建存储过程
create procedure pro3(id int,age int ,in name varchar(20),
                        out t_user_count int,out max_age int )
    begin
        insert into t_user values (id,age,name);
        select count(*),max(age) into t_user_count,max_age from t_user;
    end $

调用存储过程

-- 创建三个自定义变量
select @id:=4,@age:=23,@name:='sunba';
-- 调用存储过程
call pro3(@id,@age,@name,@t_user_count,@max_age);

验证结果:

select @t_user_count,@max_age;

在这里插入图片描述

示例5:带inout参数的存储过程

创建存储过程:

-- 设置结束符$
delimiter $
-- 创建存储过程pro4
create procedure pro4(inout a int ,inout b int)
    begin
        set a = a * 2;
        select b * 2 into b;
    end $

调用存储过程:

-- 创建2个自定义变量
set @a = 10,@b = 20;
-- 调用存储过程
call pro4(@a,@b);

验证结果:

select @a,@b;
+----|----+
| @a | @b |
+----|----+
| 20 | 40 |
+----|----+
查看存储过程
show create procedure pro4;

在这里插入图片描述

定义一个流程控制语句if else

if语句包含多个条件判断,根据结果为true,false执行语句,与编程语言中的if else if语法类似

定义存储过程
create procedure pro1(in day int)
begin
    if day = 0 then
        select '星期天';
        elseif day = 1 then
        select '星期一';
        elseif day = 2 then
        select '星期二';
        elseif day = 3 then
        select '星期三';
        elseif day = 4 then
        select '星期四';
        elseif day = 5 then
        select '星期五';
        elseif day = 6 then
        select '星期六';
    end if;
end;
调用存储过程
call pro1(5);

结果:

在这里插入图片描述

定义一个条件控制语句case

定义存储过程
create procedure pro2(in num int)
begin
    case -- 条件开始
        when  num<0 then
        select '负数';
        when num >0 then
        select '正数';
        else
        select '不是正数也不是负数';
        end case ;-- 条件结束
end;
调用存储过程
call pro2(1);

结果:

在这里插入图片描述

定义一个循环语句 while

定义存储过程
create procedure pro3(in num int ,out sum int)
begin
    set sum = 0;
    while num<10 do -- 开始循环
        set num = num + 1;
    set sum = sum +num;
    end while ; -- 结束循环
end;
调用存储过程
-- 调用函数
call pro3(0,@sum);
-- 查询函数
select @sum;

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-stXH6W0j-1678939098041)(MySQL存储过程.assets/image-20230316115725978.png)]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL存储过程 的相关文章

随机推荐

  • python+selenium实现登录功能

    python selenium实现登录功能 环境搭建 安装python python3 7 2 测试是否安装成功 python version 2 安装selenium pip install selenium 3 安装chorm driv
  • Docker 部署一个简单的 Streamlit 应用程序

    参考文献 Deploying a Simple Streamlit app using Docker Engineering Education EngEd Program Section Docker 是一个虚拟化平台 旨在通过使用容器来
  • 复化梯形、复化辛普森、复化科特斯、龙贝格MATLAB实现

    下面除了龙贝格外 其他均以此fun函数作为被积函数 梯形 辛普森 科特斯 都是已知积分上下限和分段数 求解积分近似值 function a fun x a cos x x end 一 复化梯形 function Tn ComplexTrap
  • C++11之基于范围的for循环

    系列文章 C 11之正则表达式 regex match regex search regex replace C 11之线程库 Thread Mutex atomic lock guard 同步 C 11之智能指针 unique ptr s
  • CentOS/RHEL如何在内网环境下载和安装RPM 包及其所有依赖包

    最近在学习CEPH知识 由于生产环境部署在内网 且内网环境中的yum源不完善导致安装cpeh时会有很多依赖文件没办法做到自动下载 如果手动下载所有依赖包的话过程繁琐 且有些依赖包也会依赖其他依赖包 这种俄罗斯套娃式的依赖包无疑是给学习之路增
  • tensorflow(1)---归一化

    1 归一化是属于预处理阶段的操作 2 归一化所在库sklearn processing中 3 归一化是对数据中x进行转化 y不动 x为原始数据 y为分类标签 4 归一化是把数据每列变换到差不多的数量级 5 为什么归一化 以线性回归y w1
  • Oracle截取特殊字符

    Oracle 字符截取 1 substr varchar2 start index sub length 解释 varchar2 需要处理的字符串 start index 截取起始位置 sub length 截取长度 instr varch
  • 量化投资学习-23:一图展现“牛市不言顶,熊市不言底” VS “牛市要逃顶,熊市要抄底”

  • STM32F SysTick定时器

    SysTick定时器 系统滴答定时器是一个非常基本倒计时定时器 用于在每隔一定的时间产生一个中断 即使是系统在睡眠模式下也能工作 它使得 OS 在各 CM3 器件之间的移植中不必修改系统定时器的代码 移植工作一下子容易多了 不用考虑最基本的
  • 浅谈小程序开源业务架构建设之路

    一 业务介绍 1 1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态 我们的愿景是 定义移动时代最佳体验 建设智能小程序行业标准 打破孤岛 共建开源 开放 繁荣的小程序行业生态 百度智能小程序的生态玩家有三类 分
  • Python文件读写

    在使用python编程时 经常会遇到读写文件的操作 很多童鞋困扰于读写文件的各种模式 如阅读 写入 追加等 以及搞不清open read readline readlines write等方法的使用 这篇文章就是要告诉你Python文件读写
  • python做的多激光雷达外参标定程序(超级详细完整版本)

    查阅了一番资料和现有的代码后发现 现在的多个激光雷达之间的标定程序都是ROS框架下面的 并且都是C 代码 需要安装的依赖也比较复杂 于是自己写了一个python版本的标定程序 依赖非常简单 Windows系统也可以运行 并且代码简单 扩展性
  • LeetCode 225. 用队列实现栈

    文章目录 1 用两个队列实现栈 2 用一个队列实现栈 题目链接 https leetcode cn problems implement stack using queues 1 用两个队列实现栈 C 代码如下 class MyStack
  • java获取短链short-url最终跳转地址

    import java io BufferedReader import java io InputStreamReader import java net HttpURLConnection import java net URL pub
  • 东风汽车股份有限公司MES实施案例

    一 项目背景 东风汽车股份有限公司 以下简称DFAC 汽车分公司是 东风汽车 生产东风系列轻型商用车的主要分公司 于1993年10月奠基 公司占地面积24万平方米 工业建筑面积12 2万多平方米 拥有完整的冲压 焊装 涂装 总装四大生产工艺
  • Jmeter之集合点

    JMeter也有像LR中的集合点 本篇就来介绍下JMeter的集合点如何去实现 JMeter里面的集合点通过添加定时器来完成 注意 集合点的位置一定要在Sample之前 集合点 简单来理解一下 虽然我们的 性能测试 理解为 多用户并发测试
  • [论文阅读] (19)英文论文Evaluation(实验数据集、指标和环境)如何描述及精句摘抄——以系统AI安全顶会为例

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇介绍了英文论文模型设计
  • 共享计算机后防火墙能开启,解决精简版 Windows 7 开启防火墙后无法共享文件的方法...

    我一直在使用 Prosen 做的精简版 Windows 7 系统 在开启了系统自带的防火墙之后 网络共享就老是有问题 别的电脑总是连接不进来 但是关闭系统自带的防火墙后则正常 这个问题困扰了我两三年 给别的电脑共享文件时 只能临时关闭防火墙
  • MySQL下载和安装教程--windows版

    MySQL初学者对于安装MySQL都会遇到一些问题甚至会被这些问题搞得将近崩溃 这里给出当初我从下载MySQL到安装成功启动的过程 图有点多 但过程并不复杂 希望帮助到大家 一 下载MySQL 直接从MySQL官网 https dev my
  • MySQL存储过程

    MySQL存储过程 线上程序有时候出现问题导致数据错误的时候 如果比较着急 我们可以写一个存储来快速修复这块的数据 开发中最常见的方式 存储过程相对与Java开发来说 可以并不是太好维护以及阅读的 所以不建议在程序中去调用存储过程做一些业务