MySQL之存储过程

news2025/1/11 11:52:11

MySQL存储过程

  • 1、基本介绍
    • 1.1、介绍存储过程:
    • 1.2、特点
    • 1.3、基本语法
      • 1.3.1、delimiter
      • 1.3.1、创建存储过程
      • 1.3.2、调用存储过程
      • 1.3.3、查看存储过程
      • 1.3.4、删除存储过程
  • 2、变量
    • 2.1、系统变量
      • 2.1.1、查询(会话、全局、模糊、精确)
      • 2.1.2、设置系统变量
    • 2.2、用户定义变量
      • 2.2.1、用户变量赋值(普通赋值,SQL查询赋值)
      • 2.2.2、查询用户自定义变量
    • 2.3、局部变量
  • 3、常用语句
    • 3.1、if语句
    • 3.2、参数(in,out,inout)
    • 3.3、case判断
    • 3.4、while循环
    • 3.5、repeat循环
    • 3.6、loop循环
    • 3.7、存储函数
    • 3.8、游标

1、基本介绍

1.1、介绍存储过程:

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是很有好处的。
简单来说就是把很多SQL语句进行封装处理,然后同时进行执行。

1.2、特点

封装、复用:SQL语句的代码可以进行封装和复用
可以接收参数,可以返回数据:存储过程可以接收参数,可以返回结果
减少网络交互,提升效率:不用发送多个sql语句,只需要发送存储过程就行

1.3、基本语法

1.3.1、delimiter

控制台中mysql以;进行结尾,我们在使用上面的创建方法时就会出错,所以使用 DELIMITER $来进行修改结束的处理,最后语句结束使用DELIMITER ;修改回来

1.3.1、创建存储过程

#创建p1存储过程
CREATE PROCEDURE p1()
BEGIN 
   SELECT * FROM student;
END;

控制台中:

# 控制台中mysql以;进行结尾,我们在使用上面的创建方法时就会出错,所以使用 DELIMITER $$来进行修改
# 结束的处理,最后语句结束使用DELIMITER ;修改回来
DELIMITER $
CREATE PROCEDURE p1()
BEGIN 
   SELECT * FROM student;
END$
# 修改回来
DELIMITER ;

1.3.2、调用存储过程

# 调用p1存储过程
CALL p1();

运行结果:
在这里插入图片描述

1.3.3、查看存储过程


# 查看存储过程
SHOW CREATE PROCEDURE p1;
# 查看系统表中的存储过程
SELECT * from information_schema.ROUTINES WHERE ROUTINE_SCHEMA = "表名";

1.3.4、删除存储过程

#删除存储过程
DROP PROCEDURE if EXISTS p1;

2、变量

2.1、系统变量

2.1.1、查询(会话、全局、模糊、精确)

全局变量:GLOBAL
会话变量:SESSION

# 查询全局变量(GLOBAL) 和 会话变量 (SESSION)
show GLOBAL VARIABLES;
show SESSION VARIABLES;
# 事务提交的变量(模糊匹配查看)
show GLOBAL VARIABLES like 'auto%';
# 精确查找
SELECT @@autocommit;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1.2、设置系统变量

# 设置系统变量 autocommit = 0
set SESSION autocommit = 0;
set SESSION autocommit = 1;

2.2、用户定义变量

用户定义变量 : 根据需要自己定义的变量,用户变量不需要提前声明,在使用的时候直接用"@变量名"使用就可以

2.2.1、用户变量赋值(普通赋值,SQL查询赋值)

# 赋值
set @testname = 'zzz';
set @testage := 21;
# 定义多个赋值
set @testname := 'zzz',@testage := 21;
# SQL 查询结果定义给变量
SELECT count(*) into @testcount from student;

2.2.2、查询用户自定义变量

# 使用SELECT @ 来进行查询
SELECT @testname,@testage,@testcount;

2.3、局部变量

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

# 创建存储过程,然后进行执行的处理
CREATE PROCEDURE p2()
BEGIN 
# 定义变量,然后进行赋值,然后进行输出
	 DECLARE stu_count int DEFAULT 0;
   SELECT count(*) into stu_count FROM student;
	 SELECT stu_count;
END;
# 运行存储过程
call p2();

3、常用语句

3.1、if语句

判断age如果大于18就是成年,否则就是未成年

CREATE PROCEDURE p3()
BEGIN 
# 定义age变量
    DECLARE stu_age int DEFAULT 20;
		DECLARE stu_type VARCHAR(10);
		
    if stu_age >= 18 then
		  set stu_type := '成年';
		else  
		  set stu_type := '未成年';
		end if;
		# 输出
		SELECT stu_type;
END;

call p3();

在这里插入图片描述

3.2、参数(in,out,inout)

in 输入参数
out 输出参数,可以作为返回值
inout 既可以作为输入参数,又可以作为输出参数

CREATE PROCEDURE p1([in/out/INOUT 参数名 参数类型])
BEGIN 
   SQL语句
END;

还是这个案例:判断age如果大于18就是成年,否则就是未成年

# 修改上面的处理
# stu_age为输入值,stu_type为输出值
CREATE PROCEDURE p4(in stu_age int,out stu_type VARCHAR(10))
BEGIN 	
    if stu_age >= 18 then
		  set stu_type := '成年';
		else  
		  set stu_type := '未成年';
		end if;
END;
# 赋值给result
call p4(20,@result);
# 取result这个值
SELECT @result;

在这里插入图片描述

inout 即是输入又是输出,把age*2

# inout 即是输入又是输出,把age*2
CREATE PROCEDURE p5(INOUT stu_age DOUBLE)
BEGIN 	
   set stu_age :=  stu_age  * 2;
END;
# 先进行赋值,然后在传递,然后在输出
set @stuage = 25.0;
call p5(@stuage);
SELECT @stuage;

在这里插入图片描述

3.3、case判断

根据age来进行判断: 0~18 未成年,19~60:青年,其他:老年人

# case 根据age来进行判断
CREATE PROCEDURE p6(in stu_age int)
BEGIN 
   DECLARE result VARCHAR(10);
   case 
	   WHEN stu_age >= 0 and stu_age<= 18 then set result := "未成年";
		 WHEN stu_age >= 19 and stu_age<= 60 then set result := "青年";
		 else set result := "老年人";
	 end case;
	 # 字符串拼接处理
	 SELECT CONCAT("您输入的年龄为:",stu_age,",所属分类为:",result);
END;

call p6(55);

在这里插入图片描述

3.4、while循环

求1累加到n

# while循环 求1累加到n
CREATE PROCEDURE p7(in n int)
BEGIN 
   DECLARE total int DEFAULT 0;
	 WHILE n > 0 do 
			set total := total + n;
	    set n := n-1;
	 end WHILE;
	 SELECT total;
END;

call p7(10);

在这里插入图片描述

3.5、repeat循环

有条件的循环控制语句 条件写在until的后面,满足条件就退出循环,
我们还是进行1~n的累加处理

# repeat有条件的循环控制语句  条件写在until的后面,满足条件就退出循环
CREATE PROCEDURE p8(in n int)
BEGIN 
   DECLARE total int DEFAULT 0;
	 REPEAT
	 set total := total + n;
	 set n := n-1;
UNTIL n <= 0 
END REPEAT;
	 SELECT total;
END;

call p8(10);

运行结果:
在这里插入图片描述

3.6、loop循环

计算从1~n的累加处理

# loop 计算从1累加到n
CREATE PROCEDURE p9(in n int)
BEGIN 
# 定义total变量
   DECLARE total int DEFAULT 0;
	 # 循环调用sum
	 sum: LOOP
	 set total := total + n;
	 set n := n-1;
	 # 如果小于0,在调用sum
	IF n<0 THEN
		LEAVE sum; 
	END IF; 
END LOOP sum;

	 SELECT total;
END;
#执行
call p9(10);

运行结果:
在这里插入图片描述

3.7、存储函数

还是进行1~n的处理

CREATE function fun1(n int)
RETURNS int DETERMINISTIC
BEGIN
 DECLARE total int DEFAULT 0;
 WHILE n > 0 DO
	set total := total +  n;
	set n := n-1;
END WHILE;
RETURN total;
end;

SELECT fun1(10);

3.8、游标

游标:是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理,使用游标包括游标的声明、open、fetch、close

  声明游标:   declare 游标名称 cursor for SQL语句
  打开游标:   open 游标名称;
  获取游标记录: FETCH 游标名称 into 变量;
  关闭游标:   close 游标名称;

我们把用户表中age < 指定数的数据存到另外一张表中;把name存到另外一张表中

	# 游标: 是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。
	CREATE PROCEDURE p10(in a int)
	BEGIN 
		 # 先声明变量
		 DECLARE uname VARCHAR(100);
		 # 创建游标
		 DECLARE u_cursor cursor for select `name` from student where age < a;
		 
		 # 创建另外一张表
		 DROP TABLE if EXISTS tb_user;
		 CREATE TABLE if not EXISTS tb_user(
		 id int PRIMARY KEY auto_increment,
		 `name` varchar(100)
		);
		# 打开游标
		open u_cursor;
	WHILE true DO
		FETCH u_cursor into uname;
		INSERT INTO tb_user VALUES(NULL,uname);
	END WHILE;
	# 关闭游标
		CLOSE u_cursor;
	END;
# 运行存储过程
call p10(60);
#删除存储过程
DROP PROCEDURE if EXISTS p10;

运行结果:age < 60的数据都存到了tb_user表中
原表:
在这里插入图片描述
结果表:

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

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

相关文章

IB学生必须具备的三大特质

以往的专栏亦提及过&#xff0c;修读IB课程要面对几大挑战。而要应对这些挑战&#xff0c;IB学生须具备以下三大条件&#xff1a; 时间管理能力 IBDP 首先&#xff0c;要对时间分配掌握得很好。两年的IB预科课程非常紧凑&#xff0c;不但每科都有其内部评核&#xff08;Interna…

VMware17虚拟机安装Ubuntu最新版本(Ubuntu22.04LTS)详细步骤

目录 一、概述 二、下载Ubuntu 22.04.1 LTS 三、在VMware虚拟机下安装Ubuntu22.04 四、配置网络 一、概述 Ubuntu是基于Linux内核开发的&#xff0c;免费下载&#xff0c;使用和分享的开源系统。如果需要在Linux下开发程序&#xff0c;这是一个很好的选择。本文介绍了Ubuntu最…

【问题解决】Tomcat启动服务时提示Filter初始化或销毁出现java.lang.AbstractMethodError错误

问题背景 最近在开发项目接口&#xff0c;基于SpringBoot 2.6.8&#xff0c;最终部署到外置Tomcat 8.5.85 下&#xff0c;开发过程中写了一个CookieFilter&#xff0c;实现javax.servlet.Filter接口&#xff0c;代码编译期正常。部署到外置Tomcat 8.5.85 下&#xff0c;在控制…

【Java寒假打卡】Java基础-类加载器

【Java寒假打卡】Java基础-类加载器概述类加载时机类加载的过程-加载类加载的过程-链接类加载的过程-初始化类加载器的分类类加载器-双亲委派模型类加载器-常用方法概述 负责将字节码文件加载到内存中 类加载时机 创建类的实例对象调用类的类方法访问类或者接口的类变量&am…

SymPy符号运算库与latex数学公式

SymPy符号运算库与latex数学公式sympylatexsympy SymPy是一个用于以符号运算为主的符号数学的Python库。它的目标是成为一个全功能的计算机代数系统(CAS)&#xff0c;同时保持代码尽可能的简单&#xff0c;以便易于理解和易于扩展。SymPy完全是用Python编写的。 官网地址:http…

【linux kernel】Linux设备驱动模型 | bus

文章目录一、导读二、与总线相关的数据结构&#xff08;2-1&#xff09;struct bus_type&#xff08;2-2&#xff09;struct subsys_private三、总线的初始化四、总线的操作接口&#xff08;4-1&#xff09;总线的注册&#xff08;4-2&#xff09;总线的注销&#xff08;4-3&am…

Linux的基本使用在Linux上部署程序

linux概述 Linux严格意义来说只是一个"操作系统内核"&#xff0c;一个完整的操作系统 操作系统内核 配套的应用程序 由于 Linux 是一个完全开源免费的内核&#xff0c;因此有些公司/开源组织又基于 Linux 内核&#xff0c;提供了不同的配套程序&#xff0c;这就构…

GAN“家族”又添新成员——EditGAN,不但能自己修图,还修得比你我都好

导语&#xff1a;从风格迁移到特征解耦、语言概念解耦&#xff0c;研究人员正通过数学和语言逐步改善GAN的功能。作者 | 莓酊编辑 | 青暮首先想让大家猜一猜&#xff0c;这四张图中你觉得哪张是P过的&#xff1f;小编先留个悬念不公布答案&#xff0c;请继续往下看。生成对抗网…

【蓝桥杯】历届真题 时间显示(省赛)Java

【问题描述】 小蓝要和朋友合作开发一个时间显示的网站。在服务器上&#xff0c;朋友已经获取了当前的时间&#xff0c;用一个整数表示&#xff0c;值为从1970年1月1日O0:00:00到当前时刻经过的毫秒数。 现在&#xff0c;小蓝要在客户端显示出这个时间。小蓝不用显示出年月日&a…

Allegro如何灌铜操作指导

Allegro如何灌铜操作指导 在做PCB设计平面层的铜皮时候,会需要用到灌铜的操作,如下图 灌铜可以让铜皮自动沿着Antietch画指定网络的铜皮 具体操作如下 点击Add Line命令选择Anti Etch的层面,比如Anti Etch画在L2层,线宽设置为40mil

TCP通信的三次握手和四次挥手详解

TCP通信的三次握手和四次挥手详解 计算机网络参考模型: 应用层:例如Modbus、Http、FTP 传输层:TCP、UDP 网络层:IP 数据链路层:MAC 物理层:RS485、RS232、以太网 TCP的包头: TCP包头为至少20字节 TCP包头解释  源端口号、目的端口号,用于建立连接时,确认源端口(本机…

2.Spring 等框架简单入门了解

1.Spring 1.什么是spring? 一个轻量级Java开发框架,目的是为了解决企业级应用开发 的业务逻辑层和其他各层的耦合问题. 两个核心特性&#xff0c;也就是依赖注入(dependency injection&#xff0c;DI)和面向切面编程(aspect- oriented programming&#xff0c;AOP) 2.IOC(控制…

一文带你秒懂十大排序

目录 一、排序的概述 二、插入排序 1、直接插入排序 2、希尔排序 二、选择排序 1、直接选择排序 2、堆排序 三、交换排序 1、冒泡排序 2、快速排序 四、归并排序 五、计数排序 六、基数排序 七、桶排序 八、排序总结 一、排序的概述 排序就是将一组…

pod私有库

私有库制作步骤 1、在gitlab上创建一个空项目&#xff0c;并用source tree导到本地&#xff0c;便于后面代码更新上传 2、cd 到项目下 执行pod lib create 【组件名】如&#xff1a;pod lib create TDAlertView 输入命令后会显示下载模板&#xff0c;会有几秒钟等待 Cloni…

一文搞懂 python 中的 classmethod、staticmethod和普通的实例方法的使用场景

什么是类方法&#xff08;classmethod&#xff09;/静态方法&#xff08;staticmethod&#xff09;和普通成员方法&#xff1f; 首先看这样一个例子&#xff1a; class A(object):def m1(self, n):# 属于实例对象&#xff0c;self 指代实例对象&#xff0c;print("self:…

Allegro如何更改钻孔孔符以及大小操作指导

Allegro如何更改钻孔孔符以及大小操作指导 PCB设计完成时,需要放出整板的钻孔表来,有的钻孔孔符以及大小并不是需要的,Allegro支持更改钻孔符以及大小,如下图 需要更改孔符以及大小, 具体操作如下 选择Manufacture选择NC

aws parallelcluster 理解 parallelcluster 集群的配置和使用

参考资料 Setup AWS ParallelCluster 3.0 with AWS Cloud9 200 HPC For Public Sector Customers 200 HPC pcluster workshop 200 Running CFD on AWS ParallelCluster at scale 400 Tutorial on how to run CFD on AWS ParallelCluster 400 Running CFD on AWS ParallelC…

CSS 伪元素也可以被用于反爬案例?来学习一下。26

先说一下什么是 CSS 中的伪元素&#xff0c;CSS 伪元素的概念是指在 CSS 中使用的一些特殊的元素&#xff0c;它们不存在于 HTML 文档中&#xff0c;而是由浏览器生成的元素&#xff0c;用于提供额外的样式控制。这些伪元素在 HTML 代码中不存在&#xff0c;但可以在 CSS 中通过…

[idekCTF 2023] Malbolge I Gluttony,Typop,Cleithrophobia,Megalophobia

这些题名字我都不认识&#xff0c;这是什么语呀。这个比赛感觉太难了&#xff0c;加上春节将近比较忙&#xff0c;仅作了4个简单题。记录一下。Misc/Malbolge I Gluttony这是个虚拟机的题&#xff0c;放入misc感觉有点不可思忆&#xff0c;题目给了7个命令&#xff0c;有"…

【云原生进阶之容器】第五章容器运行时5.1节--容器运行时总述

1 Kubernetes引言 Kubernetes 已经成为容器编排调度领域的事实标准,其优良的架构不仅保证了丰富的容器编排调度功能,同时也提供了各个层次的扩展接口以满足用户的定制化需求。其中,容器运行时作为 Kubernetes 管理和运行容器的关键组件,当然也提供了简便易用的扩展…