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

这篇具有很好参考价值的文章主要介绍了【MySQL 数据库】9、存储过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、存储过程是什么

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

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

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

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

二、存储过程的基本语法

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

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

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

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

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

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

三、MySQL 中的变量

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

(1) 系统变量

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

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

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

show global variables like 'auto%';

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

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

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

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

(2) 用户自定义变量

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

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

赋值方式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 块内

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

# 创建存储过程
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();

五、参数传递和返回值

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

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


根据传入参数 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 语句

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

根据传入的月份,判定月份所属的季节(要求采用 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 循环

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

🌼 计算从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 循环

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

🌼 计算从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:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。

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

🌼 计算从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

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

🌿 根据传入的参数 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);

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

十一、条件处理程序

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

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

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文章来源地址https://www.toymoban.com/news/detail-478875.html

到了这里,关于【MySQL 数据库】9、存储过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库——存储过程-变量(系统变量、用户定义变量、局部变量)

    目录 系统变量  1.查看系统变量  2.设置系统变量 演示示例 用户定义变量 1.赋值  2.使用 演示示例 局部变量 声明  赋值 演示示例 变量 在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。 系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全

    2024年02月05日
    浏览(38)
  • 使用MySQL存储过程提高数据库效率和可维护性

    MySQL 存储过程是一种强大的数据库功能,它允许你在数据库中存储和执行一组SQL语句,类似于编程中的函数。存储过程可以大幅提高数据库的性能、安全性和可维护性。本文将详细介绍MySQL存储过程的使用。 MySQL存储过程是一组预编译的SQL语句,它们以一个名称存储在数据库

    2024年02月08日
    浏览(35)
  • MySQL数据库——存储过程-介绍以及基本语法(特点、创建、调用、查看、删除、示例)

    目录 介绍 特点 基本语法 创建 调用 查看 删除  示例  存储过程是 事先经过编译 并 存储在数据库 中的一段 SQL 语句的 集合 ,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想

    2024年02月06日
    浏览(46)
  • 数据库系统原理及MySQL应用教程实验七存储过程与函数的创建管理

    1. 理解存储过程和函数的概念。 2. 掌握创建存储过程和函数的方法。 3. 掌握执行存储过程和函数的方法。 4. 掌握游标的定义、使用方法。 1.验证性实验:某超市的食品管理的数据库的Food表对其操作。 2.设计性试验:学校教师管理数据库中的teacherInfo表对其操作。 三、实验步

    2024年02月03日
    浏览(42)
  • 【Mysql】X-DOC:Mysql数据库大量数据查询加速(定时JOB和存储过程应用案例)

    在某中台系统中,设计了大量的基础数据(维度数据、维度映射关系等)来支撑业务功能,业务表中存在大量的维度外键关联字段,其优点是可以实现前端的选择录入,数据校验,确保录入数据的准确性;缺点是在做业务报表时,需要做大量的维度关联(join)操作。 受限于

    2024年02月12日
    浏览(32)
  • 【MySQL】探索MySQL存储过程的魔力,初学者的数据库编程秘笈(内含实战SQL脚本)

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:重温MySQL MySQL存储过程作为一种服务器端的 数据库编程方式 ,提供了高效、可重用的方法来执行相对复杂的数据库操

    2024年02月15日
    浏览(47)
  • 数据库: 存储过程

    sql server begin end用法: SQL Server中的BEGIN END用法是用于定义一个代码块,这个代码块可以包含多个SQL语句,BEGIN END通常用于控制流程语句,例如IF语句、WHILE语句、TRY CATCH语句等。在BEGIN END代码块中,可以使用变量、函数、存储过程等SQL Server的元素。BEGINEND的语法如下: BEGIN SQL语

    2024年02月09日
    浏览(31)
  • Oracle数据库创建存储过程

    下面是一个迁移数据库数据的存储过程: 存储过程中用到的 while 循环逻辑:  

    2024年02月11日
    浏览(33)
  • 数据库实验6 存储过程实验

    前言:游标的mysql代码不懂写,所以没有运行结果 实验6.1 存储过程实验 1.实验目的 掌握数据库 PL/SQL 编程语言,以及数据库存储过程的设计和使用方法。 2.实验内容和要求 存储过程定义,存储过程运行,存储过程更名,存储过程删除,存储过程的参数传递。掌握PL/SQL编程语言和编

    2024年02月04日
    浏览(39)
  • 进阶数据库系列(十一):PostgreSQL 存储过程

    前面介绍了 PostgreSQL 数据类型和运算符、常用函数、锁操作、执行计划、视图与触发器相关的知识点,今天我将详细的为大家介绍 PostgreSQL 存储过程相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!! 工作中可能会存在业务比较复杂,重复性

    2024年02月03日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包