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

目录

  • 一、存储过程是什么
  • 二、存储过程的基本语法
  • 三、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

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

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

相关文章

Java反射与注解

文章目录 一、 注解1.简介2. 元注解3. 自定义注解 二、 反射1. 简介2. 理解Class类并获取Class实例3. 类的加载与初始化4. 类加载器ClassLoader5. 获取运行时类的完整结构6. 动态创建对象执行方法7. 反射操作泛型8. 反射操作注解 一、 注解 1.简介 Annotation是JDK5.0开始引入…

第二章 搭建TS环境

搭建 TypeScript 的开发环境。一个舒适、便捷且顺手的开发环境&#xff0c;不仅能大大提高学习效率&#xff0c;也会对我们日常的开发工作有很大帮助。 这一节我们就来介绍 VS Code 下的 TypeScript 环境搭建&#xff1a;插件以及配置项。对于 TS 文件的执行&#xff0c;我们会…

《横向联邦学习中 PCA差分隐私数据发布算法》论文算法原理笔记

论文地址&#xff1a;https://www.arocmag.com/article/01-2022-01-041.html 论文摘要 为了让不同组织在保护本地敏感数据和降维后发布数据隐私的前提下&#xff0c;联合使用 PCA进行降维和数据发布&#xff0c;提出横向联邦 PCA差分隐私数据发布算法。引入随机种子联合协商方…

linuxOPS基础_linux软件包安装

软件包概述 上图是windows下的软件包 Linux下也有很多可以安装的软件&#xff0c;而这些软件的安装包可细分为两种&#xff0c;分别是源码包和二进制包。 Linux下软件的安装方式 ① RPM软件包安装 > 软件名称.rpm ② YUM包管理工具 > yum install 软件名称 -y ③ 源码…

基于QGIS的长株潭城市群边界范围融合实战

背景 在面向区域的研究过程中&#xff0c;比如一些研究区域&#xff0c;如果是具体的行政区划&#xff0c;比如具体的某省或者某市或者县&#xff0c;可以直接从国家官方的地理数据中直接下载就可以。但如果并没有直接的空间数据那怎么办呢&#xff1f;比如之前遇到的一个场景&…

【郭东白架构课 模块二:创造价值】31 |节点六: 如何组织阶段性的价值交付?

你好&#xff0c;我是郭东白。上节课我们讲了为什么要做阶段性的价值交付&#xff0c;以及进入阶段性价值交付环节的准备工作。有了这些学习基础&#xff0c;这节课我们就可以进行阶段性价值交付了。 在交付的过程中&#xff0c;主要有三部分工作&#xff1a;目标分解、定义交…

数据结构——堆(C语言实现)

文章目录 什么是堆堆的实现堆的结构定义堆的初始化接口堆的销毁接口堆的插入数据接口向上调整建堆接口判断堆是否为空堆的删除数据接口向下调整建堆接口获取堆顶数据获取堆的有效数据个数完整实现代码小结 堆排序堆排序的实现 关于建堆和堆排序时间复杂度的分析向下调整建堆向上…

day52|动态规划13-子序列问题

子序列系列问题 300.最长递增子序列 什么是递增子序列&#xff1a; 元素之间可以不连续&#xff0c;但是需要保证他们所在位置是元素在数组中的原始位置。 dp数组dp[i]表示以nums[i]为结尾的最长递增子序列的长度。递归函数&#xff1a;dp[i] max(dp[j]1,dp[j])初始化条件&…

算法刷题-链表-移除链表元素

链表操作中&#xff0c;可以使用原链表来直接进行删除操作&#xff0c;也可以设置一个虚拟头结点再进行删除操作&#xff0c;接下来看一看哪种方式更方便。 203.移除链表元素 力扣题目链接 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&…

Linux下信号量使用总结

目录 1.Linux下信号量简介 2.POSIX信号量 2.1 无名信号量 2.2 有名信号量 3.System V信号量 1.Linux下信号量简介 信号量是解决进程之间的同步与互斥的IPC机制&#xff0c;互斥与同步关系存在的症结在于临界资源。 临界资源是在同一个时刻只容许有限个&#xff08;一般只有…

【数据结构与算法】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 队列的基本概念 队…

Linux内核中断和Linux内核定时器

目录 Linux内核中断 Linux内核定时器 Linux内核中断 int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev) 功能&#xff1a;注册中断 参数&#xff1a; irq : 软中断号 gpio的软中断号 软中断号 gpio_to_i…

【PCB专题】案例:绕等长怎么直接以颜色区分看出是否绕好

PCB上对于时序的处理,在板卡上实际我们是通过绕等长的手段。做为一个合格的Layout工程师,等长的处理是不可或缺的技能。 一般来说,在绕等长的时候我们可以使用Delay Tune命令来改变走线的长度,然后通过规则管理器中分析看看哪根线长哪根线短。 但是在实际工作中,很可能绕着…

Android应用程序进程的启动过程

Android应用程序进程的启动过程 导语 到这篇文章为止&#xff0c;我们已经简要地了解过了Android系统的启动流程了&#xff0c;其中比较重要的内容有Zygote进程的启动和SystemService以及Launcher的启动&#xff0c;接下来我们将要学习的是Android应用程序的启动过程&#xff…

华为OD机试真题 JavaScript 实现【最多几个直角三角形】【2023Q1 100分】

一、题目描述 有 N 条线段&#xff0c;长度分别为 a[1]-a[n]。 现要求你计算这 N 条线段最多可以组合成几个直角三角形&#xff0c;每条线段只能使用一次&#xff0c;每个三角形包含三条线段。 二、输入描述 第一行输入一个正整数 T (1< T< 100) &#xff0c;表示有…

2023蓝桥杯大学A组C++决赛游记+个人题解

Day0 发烧了一晚上没睡着&#xff0c;感觉鼻子被打火机烧烤一样难受&#xff0c;心情烦躁 早上6点起来吃了个早饭&#xff0c;思考能力完全丧失了&#xff0c;开始看此花亭奇谭 看了六集&#xff0c;准备复习数据结构考试&#xff0c;然后秒睡 一睁眼就是下午2点了 挂了个…

springboot项目外卖管理 day05-新增与删除套餐

文章目录 一、新增菜品1.1、需求分析1.2、数据模型setmealsetmeal_dish 1.3、代码开发-梳理交互过程1.3.1、下拉框展示1.3.2、菜品窗口展示1.3.3、新增套餐 2、套餐分页查询 一、新增菜品 1.1、需求分析 套餐就是菜品的集合。 后台系统中可以管理套餐信息&#xff0c;通过新…

一文打通:从字节码指令的角度解读前置后置自增自减(加加++减减--)

文章目录 1.前置了解的知识1.1 栈这种数据结构1.2 局部变量表和操作数栈1.3 三个字节码指令 2.单独使用后置与前置2.1 后置字节码指令2.2 前置字节码指令2.3 总结 3.需要返回值的情况下使用后置与前置3.1 后置字节码指令3.2 前置字节码指令3.3 总结3.4 练习&#x1f340; 练习一…

了解ASEMI代理英飞凌TLE6208-6G其功能和应用的综合指南

编辑-Z TLE6208-6G是一款高度集成、通用且高效的汽车半桥驱动器&#xff0c;由英飞凌设计。这种功能强大的设备专门设计用于满足汽车应用的苛刻要求&#xff0c;如控制直流电机、螺线管和电阻负载。在本文中&#xff0c;我们将深入研究TLE6208-6G的功能、优点和应用&#xff0…

实现表白墙

我们已经学习了Http以及Servlet类的相关知识 今天我们来实操一下,实现一个简单的既有前端又有后端的网站–表白墙 之前在学习前端的时候已经写过了表白墙的前端代码,存在两个问题 1.页面重启,数据丢失 2.数据只是在本地的,别人看不见 那么这样的问题我们要咋样解决呢? 引入…