【MySQL 数据库】9、存储过程

news2025/1/28 1:14:08

目录

  • 一、存储过程是什么
  • 二、存储过程的基本语法
  • 三、MySQL 中的变量
    • (1) 系统变量
    • (2) 用户自定义变量
    • (3) 局部变量
  • 四、if 判断
  • 五、参数传递和返回值
  • 六、case 语句
  • 七、while 循环
  • 八、repeat 循环
  • 九、loop 循环
  • 十、游标
  • 十一、条件处理程序

一、存储过程是什么

🌱 存储过程是事先经过编译并存储在数据库中的 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,可以提高数据处理效率

🌱 存储过程思想上很简单:就是数据库 SQL 语言层面的代码封装与重用

在这里插入图片描述

🍃 【封装,复用】可以把某一业务的 SQL 封装在存储过程中,需要用到的时候直接调用存储过程
🍃 可以接收参数,也可以返回数据
🍃 【减少网络交互,效率提升】如果涉及到多条 SQL,每执行一次都是一次网络传输。 而如果封装在存储过程中,只需要网络交互一次就可以了

二、存储过程的基本语法

在这里插入图片描述

在这里插入图片描述

# 创建存储过程
CREATE PROCEDURE p ( ) BEGIN
SELECT
	count( * ) '学生数量'
FROM
	student;
END;

# 执行存储过程
CALL p();

# 删除存储过程
DROP PROCEDURE IF EXISTS p;

在这里插入图片描述

三、MySQL 中的变量

MySQL 中的变量分为三种: 系统变量、用户定义变量、局部变量

(1) 系统变量

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

在这里插入图片描述

# 查看系统变量
show variables;
show session variables;
show global variables;

show global variables like 'auto%';

select @@autocommit;
select @@global.autocommit;
select @@session.autocommit;

在这里插入图片描述

set session autocommit = 0;
set @@session.autocommit = 1;

在这里插入图片描述

(2) 用户自定义变量

  • 用户定义变量:是用户自己定义的变量,用户变量不用提前声明
  • 赋值的时候直接用@变量名 就可以。
  • 其作用域为当前连接

在这里插入图片描述

赋值方式1:

set @my_name = '张国庆';
set @my_age = 3;
set @my_gender = 'boy', @my_hobby = 'sleep';

# 查看变量
select @my_name, @my_age, @my_gender, @my_hobby;

赋值方式2:

select @money := 16685206840;
select @money '张国庆的银行卡余额';

赋值方式3:

select count(*) into @student_num from student;

select @student_num '学生数量';

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

(3) 局部变量

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

在这里插入图片描述

# 创建存储过程
create procedure p_test1 () 
begin

declare stu_num int default 0;
select count(*) into stu_num from student;
select stu_num '学生人数';

end;

# 调用存储过程
call p_test1();

四、if 判断

根据定义的分数 score 变量,判定当前分数对应的分数等级:
🌼 score >= 85分,等级为优秀
🌼 score >= 60分 且 score < 85分,等级为及格
🌼 score < 60分,等级为不及格

create procedure p100() 
begin

declare score int default 66;
declare result char(3);

if score > 85 then
	set result := '优秀';
elseif score > 60 then
	set result := '及格';
else 
	set result := '不及格';
end if;

select result '分数等级';

end;

# 调用
call p100();

五、参数传递和返回值

在这里插入图片描述

在这里插入图片描述


根据传入参数 score,判定当前分数对应的分数等级,并返回
🌱 score >= 85分,等级为优秀
🌱 score >= 60分 且 score < 85分,等级为及格
🌱 score < 60分,等级为不及格

create procedure p101(in score int, out result char(3)) 
begin

if score > 85 then
	set result := '优秀';
elseif score > 60 then
	set result := '及格';
else 
	set result := '不及格';
end if;

end;

# 调用
call p101(58, @result);

# 查看返回值
select @result 'result';

🍃 将传入的 200 分制的分数换算成百分制,然后返回

create procedure p102(inout score double) 
begin
  # set score = score * 0.5;
	set score = score >> 1;

end;

# 调用
set @param_result = 78;
call p102(@param_result);

# 查看返回值
select @param_result 'score';

六、case 语句

在这里插入图片描述

根据传入的月份,判定月份所属的季节(要求采用 case 结构)。
🌴 1-3月份,为第一季度
🌴 4-6月份,为第二季度
🌴 7-9月份,为第三季度
🌴 10-12月份,为第四季度

create procedure p103(in `month` int) 
begin

  declare result char(4);
	
	case
		when month between 1 and 3 then set result := '第一季度';
		when month <= 4 and month >= 6 then set result := '第二季度';
		when month between 7 and 9 then set result := '第三季度';
		when month between 10 and 12 then set result := '第四季度';
		else set result = '非法参数';
	end case;
	
	select concat(`month`, '月份是', result) 'result';

end;

# 调用 
call p103(09);

七、while 循环

在这里插入图片描述

🌼 计算从1累加到 n 的值,n 为传入的参数值

create procedure p104(in n int) 
begin

  declare sum int default 0;
	
	while n > 0 do
		set sum := sum + n;
		set n := n - 1;
	end while;
	
	select sum;

end;

# 调用 
call p104(100);

八、repeat 循环

在这里插入图片描述

🌼 计算从1累加到 n 的值,n 为传入的参数值

create procedure p105(in n int) 
begin

  declare sum int default 0; 
	
	repeat
		set sum := sum + n;
		set n = n -1;
	until n <= 0
	end repeat;
	
	select sum;

end;

# 调用 
call p105(10);

九、loop 循环

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

在这里插入图片描述

🌼 计算从1累加到 n 的值,n 为传入的参数值

create procedure p106(in n int) 
begin
  declare sum int default 0; 
	
	flag:loop
		if n <= 0 then
			 leave flag;
		end if;
		
		set sum := sum + n;
		set n := n - 1;
	end loop flag;
	
	select sum;
end;

# 调用 
call p106(10);

十、游标

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

在这里插入图片描述

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

select * from tb_age_name_pro;

create procedure p_cursor(in uage int) 
begin

  # 局部变量声明必须在游标声明之前
	declare uname varchar(100);
	declare uprofession varchar(100); 
	
	# 定义游标(用于存储结果集)
	declare age_name_pro_cursor cursor for select `name`, profession from tb_user where age <= uage;
	
	# 创建表
	drop table if exists tb_age_name_pro;
	create table if not exists tb_age_name_pro (
		id int primary key auto_increment, 
		uname varchar(100),
		uprofession varchar(100)
	); 
	
	# 游标操作
	open age_name_pro_cursor; # 打开游标
	
	# 循环获取游标记录
	while true do # 死循环
		fetch age_name_pro_cursor into uname, uprofession;
		# 把获取到的数据插入到表中
		insert into tb_age_name_pro values (null, uname, uprofession); 
	end while;
	
	# 关闭游标
	close age_name_pro_cursor; 

end;

call p_cursor(18);

在这里插入图片描述

十一、条件处理程序

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

在这里插入图片描述

create procedure p_cursor(in uage int) 
begin

  # 局部变量声明必须在游标声明之前
	declare uname varchar(100);
	declare uprofession varchar(100); 
	declare uuage varchar(3);
	
	# 定义游标(用于存储结果集)
	declare age_name_pro_cursor cursor for select age, `name`, profession from tb_user where age <= uage;
	
	# 创建条件处理程序
	# (1) 当 SQL 状态码是 02000 的时候触发该条件处理程序, 触发该程序后:① 关闭游标;② 终止当前程序
	# declare exit handler for sqlstate '02000' close age_name_pro_cursor;
	declare exit handler for not found close age_name_pro_cursor;
	
	# 创建表
	drop table if exists tb_age_name_pro;
	create table if not exists tb_age_name_pro (
		id int primary key auto_increment, 
		uuage varchar(3),
		uname varchar(100),
		uprofession varchar(100)
	); 
	

	
	# 游标操作
	open age_name_pro_cursor; # 打开游标
	
	# 循环获取游标记录
	while true do
		fetch age_name_pro_cursor into uuage, uname, uprofession;
		# 把获取到的数据插入到表中
		insert into tb_age_name_pro values (null, uuage, uname, uprofession);
	end while;
	
	# 关闭游标
	close age_name_pro_cursor; 

end;

# 调用存储过程
call p_cursor(22);

https://dev.mysql.com/doc/refman/8.0/en/declare-handler.html

https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html

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

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

相关文章

Linux进程间通信【消息队列、信号量】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、消息队列1.1、什么是消息队列&#xff1f;1.2、消息队列的数据结构1.3、消…

交通物流模型 | Python实现基于张量分解的交通流量时空模式挖掘(出租车车载GPS数据、公交卡刷卡数据、POI的分布数据)

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 一般出行行程通常都由某种明确目的驱使,例如上班、购物或娱乐,出行的起始区域因其承担功能的不同,通常能够反映出用户的出行目的,于此同时,从宏观来看,区域之间的交通流量在一天内的变化规律也能够反…

【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)

一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列&#xff08;静态队列&#xff09;1.22 循环队列1.23 优先级队列 1.3 队列的链式存储结构 二、C语言实现2.1 顺序存储2.11 顺序队列2.12 循环队列2.13 优先级队列 2.2 链式存储 一、概念 1.1 队列的基本概念 队…

【python】—— python的基本介绍并附安装教程

前言&#xff1a; 今天&#xff0c;我将给大家讲解关于python的基本知识&#xff0c;让大家对其有个基本的认识并且附上相应的安装教程以供大家参考。接下来&#xff0c;我们正式进入今天的文章&#xff01;&#xff01;&#xff01; 目录 前言 &#xff08;一&#xff09;P…

【Linux】互斥量原理的实现

深刻理解互斥锁 文章目录 前言一、demo版的线程封装二、demo版的锁封装总结 前言 为了实现互斥锁操作 , 大多数体系结构都提供了 swap 或 exchange 指令 , 该指令的作用是把寄存器和内存单元的数据相交换, 由于只有一条指令 , 保证了原子性 , 即使是多处理器平台 , 访问内存的总…

第10讲:深入剖析 Agent 插件原理,无侵入性埋点

AbstractClassEnhancePluginDefine 核心实现 在开始之前&#xff0c;先简单回顾上一课时中关于 AbstractClassEnhancePluginDefine 的一个核心知识点&#xff1a;AbstractClassEnhancePluginDefine 是所有插件的父类&#xff0c;SkywalkingAgent.Transformer 会通过其 enhance…

信号完整性:反射

反射是怎么形成的 信号的反射和互连线的阻抗密切相关。反射的最直接原因是互连线的阻抗发生了突然变化&#xff0c;只要互连线的阻抗不连续的点&#xff0c;该处就会发生反射。 信号是以电磁波的形式在走线中传播的&#xff0c;如果从传统的电路理论角度去看&#xff0c;是无…

YOLOv5使用自定义数据集实验

上一篇博文中介绍了YOLOv7训练自定义数据集&#xff0c;在这篇文章中&#xff0c;我们主要记录YOLOv5模型的实验过程&#xff0c;用于对比实验。 YOLOv5与YOLOv7毕竟一母同胞&#xff0c;因此部署起来也是极为类似。 数据集 数据集使用的与YOLOv7的实验数据集一样&#xff0c;…

windows服务器自带IIS搭建网站并发布公网访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 转载自远程源码文章&#xff1a;【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网…

VS2019生成和使用lib、dll文件

叠甲&#xff1a;本文非常简略&#xff0c;方法非常朴素&#xff0c;仅供参考。 目录 lib文件 生成lib文件 使用lib文件 dll文件 生成dll文件 使用dll文件 lib文件 生成lib文件 新建项目libTest。 右键项目→属性→配置属性→常规→配置类型&#xff0c;选择“静态库…

【Java】表白墙终章-飞流直下的“甜言蜜语”-瀑布流式布局

飞流直下三千尺&#xff01; 文章目录 【Java】表白墙终章-飞流直下的“甜言蜜语”-瀑布流式布局1. 效果前后对比2. 瀑布流式布局原理思想3. 约定前后端接口4. 后端代码4.1 修改Love类的定义4.2 修改doPost方法4.3 修改save方法4.4 修改doGet方法4.5 修改load方法 5. 前端瀑布流…

面试总结个人版

一、面试题 java 集合 &#xff0c; spring springmvc springboot springcloud 数据库相关的&#xff0c; redis 相关 &#xff0c;mq 相关 &#xff0c;结合业务的场景题 1、part one 集合 HashMap底层原理 HashMap是基于哈希表的Map接口的非同步实现。元素以键值对的形式存…

asp.net教师调课系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net教师调课管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net教师调课系统VS开发sqlser…

deadline用WebService提交Job

官方文档 网站链接 进入rest API&#xff0c;点击jobs&#xff0c;找到submit job 这里可以看到消息体需要用到JobInfo和PluginInfo这两个关键的字典&#xff08;json object&#xff09; 拿到对应的键值对 为了填写url请求的消息体 我们需要拿到必须参数的键值对 点击双击…

如何延长电脑硬盘的使用寿命?

在日常使用电脑过程中&#xff0c;一定要做好硬盘的保养和维护&#xff0c;一旦硬盘损坏&#xff0c;保存在硬盘上的数据就会丢失&#xff0c;而且找回数据也是一件很费功夫的事情&#xff0c;甚至有可能永远也找不回来。所以日常工作中定期对资料进行备份&#xff0c;做好电脑…

【算法与数据结构】24、LeetCode两两交换链表中的节点

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;题目要求两两交换节点。在链表当中非常重要就是下一个节点&#xff0c;一旦丢失&#xff0c;这个节点后…

IDL基础语法

1 创建变量 命名规则&#xff1a;变量名必须以字母开头。它们可以包括其它字母&#xff0c;数字&#xff0c;下划线&#xff0c;美元符号。 以下是创建不同数据类型的方法&#xff0c;我们只需了解即可&#xff0c;知道如何创建整型【16位有符号长整型】和浮点型 PRO learn;创…

RedisGraph的整体架构

The architecture of RedisGraph 本文关注RedisGraph的整体架构&#xff0c;分别从图存储模型、索引、并发控制、和执行计划四个方面简要阐述。下图为RedisGraph的整体架构图。 1 图存储模型 了解一个图数据库的架构&#xff0c;最重要的就是其图存储模型&#xff0c;即其中的…

freeswitch 使用 silero-vad 静音拆分使用 fastasr 识别

silero-vad 在git 的评分挺高的测试好像比webrtc vad好下面测试下 silero-vad 支持c 和py 由于识别c的框架少下面使用py 以下基于python3.8torch1.12.0torchaudio 1.12.0 1.由于fastasr 需要16k 所以 将freeswitch的实时音频mediabug 8k转成16k 用socket传到py 模块代码…

二十三种设计模式(待更)

二十三种设计模式 二十三种设计模式结构型1.适配器 相关资料 二十三种设计模式 资料来源于老师讲解以及大佬的设计模式仓库 zhengqingya 结构型 将对象和类按某种布局组成更大的结构&#xff0c;并同时保持结构的灵活和⾼效。 1.适配器 将一个类的接口转换成客户希望的另外…