MySQL:进阶巩固-存储过程

news2024/9/24 23:45:54

目录

    • 一、存储过程的概述
    • 二、存储过程的基本使用
      • 2.1 创建存储过程
      • 2.2 使用存储过程
      • 2.3 查询指定数据库的存储过程以及状态信息
      • 2.4 查看某个存储过程的定义
      • 2.5 删除存储过程
      • 2.6 案例
    • 三、存储过程的变量设置
      • 3.1 系统变量
      • 3.2 用户自定义变量
      • 3.3 局部变量
    • 四、IF判断
    • 五、参数
    • 六、CASE判断
    • 七、While循环
    • 八、repeat循环
    • 九、loop循环
    • 十、游标
    • 十一、条件处理程序


在这里插入图片描述

一、存储过程的概述

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用

特点:

  • 封装、复用
  • 可以接收参数,也可以返回数据
  • 减少网络交互,提高效率

二、存储过程的基本使用

2.1 创建存储过程

CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
	-- SQL语句
END;

2.2 使用存储过程

CALL 存储过程名称([参数]);

2.3 查询指定数据库的存储过程以及状态信息

SELECT * FROM information_schema.routines WHERE routine_schema=数据库名称;

2.4 查看某个存储过程的定义

SHOW CREATE PROCEDURE 存储过程名称;

2.5 删除存储过程

DROP PROCEDURE IF EXISTS 存储过程名称;

2.6 案例

-- 创建存储过程
CREATE PROCEDURE p1()
BEGIN
	SELECT COUNT(*) 人员数量 FROM tb_emp;
END;
-- 调用存储过程
CALL p1();
-- 查询指令数据库的存储过程以及状态信息
SELECT * FROM information_schema.routines WHERE routine_schema='mysql_demo';
-- 查看某个存储过程的定义
SHOW CREATE PROCEDURE p1;
-- 删除存储过程
DROP PROCEDURE IF EXISTS p1;

注意:在命令行中,执行创建存储过程的SQL时,需要通过关键字delimiter指定SQL语句的结束符。

delimiter $$

指定delimiter之后,SQL语句的结束符就是$$,之后还需要在更改回来

delimiter ;

三、存储过程的变量设置

3.1 系统变量

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

查看所有系统变量

SHOW [SESSION|GLOBAL] VARIABLES;

LIKE模糊匹配查找变量

SHOW [SESSION|GLOBAL] VARIABLES LIKE '......';

查看指定变量的值

SELECT @@[SESSION|GLOBAL].系统变量名; 

设置系统变量

SET [SESSION|GLOBAL] 系统变量名=;

SET @@[SESSION|GLOBAL] 系统变量名=;

注意:
1. 如果没有指定SESSION|GLOBAL,默认是SESSION,绘画变量。
2. MySQL服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在/etc/my.cnf中配置

3.2 用户自定义变量

用户自定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用"@变量名"使用即可。其作用域是当前会话(SESSION)。

赋值

SET @var_name = expr;

SET @var_name := expr;  // 推荐使用

SELECT @var_name := expr;

SELECT 字段名 INTO @var_name FROM 表名;

使用

SELECT @var_name;
SET @myname = '张三';
SET @myage = '18';
SET @mygender = '男';
SET @myhobby = '篮球';

SELECT @myname,@myage,@mygender,@myhobby;

注意:如果查询没有定义的变量,他不会报错,只不过获取到的值为NULL

3.3 局部变量

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

声明

DECLARE 变量名 变量类型[DEFAULT...];

变量类型就是数据库字段类型:INT、BEGIN、CHAR、VARCHAR、DATE、TIME等
赋值

SET 变量名 =;
SET 变量名 :=;

SELECT 字段名 INTO 变量名 FROM 表名...;
CREATE PROCEDURE p2()
BEGIN
	DECLARE stu_count int DEFAULT 0;
	SELECT COUNT(*) INTO stu_count FROM tb_user;
	SELECT stu_count;
END;

CALL p2();

查询

SELECT 局部变量名;

四、IF判断

IF 条件 THEN
	...
ELSEIF 条件2 THEN
	...
ELSE 
	...
END IF;
CREATE PROCEDURE p3()
BEGIN
	DECLARE age int DEFAULT 18;
	DECLARE result VARCHAR(10);
	
	IF age < 18 THEN
		SET result := '小孩';
	ELSEIF age >=18 AND age <= 35 THEN
		SET result := '青年';
	ELSE
		SET result := '老年';
	END IF;
	SELECT result;
END;

CALL p3();

五、参数

类型含义备注
IN输入参数默认
OUT输出参数
INOUT输入、输出参数

语法

CREATE PROCEDURE 存储过程名称([IN/OUT/INOUT 参数名 参数类型])
BEGIN
	....
END;

输入参数与输出参数

CREATE PROCEDURE P4(IN age INT, OUT result VARCHAR(10))
BEGIN
	IF age < 18 THEN
		SET result := '小孩';
	ELSEIF age >=18 AND age <= 35 THEN
		SET result := '青年';
	ELSE
		SET result := '老年';
	END IF;
END;
-- 执行存储过程
CALL p4(18, @result);
-- 查看返回结果
SELECT @result;

输入、输出参数

CREATE PROCEDURE p5(INOUT score DOUBLE)
BEGIN
 SET score := score * 0.5;
END;

SET @score = 80;
CALL p5(@score);
SELECT @score;

六、CASE判断

语法一:

CASE case_value
	WHEN when_value1 THEN statement_list1
	WHEN when_value2 THEN statement_list2
	...
	ELSE statement_list
END CASE;

语法二:

CASE
	WHEN search_condition1 THEN statement_list1
	WHEN search_condition2 THEN statement_list2
	...
	ELSE statement_list
END CASE;
-- 根据传入的月份,判断月份所属的季节
-- 1-3月份 第一季度
-- 4-6月份 第二季度
-- 7-9月份 第三季度
-- 10-12月份 第四季度
CREATE PROCEDURE p6(IN month INT, OUT result VARCHAR(10))
BEGIN
	CASE 
		WHEN month >= 1 AND month <=3 THEN
			SET result := '第一季度';
		WHEN month >= 4 AND month <=6 THEN
			SET result := '第二季度';
		WHEN month >= 7 AND month <=9 THEN
			SET result := '第三季度';
		WHEN month >= 10 AND month <=12 THEN
			SET result := '第三季度';
		ELSE
			SET result := '你家有这个月份啊!';
	END CASE;
END;

SET @month := 6;
CALL p6(@month, @result);
SELECT CONCAT('您输入的月份为:', @month, ' 所属季度为:', @result)

七、While循环

while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句

# 先判断条件,如果条件为True,则执行逻辑,否则不执行逻辑
WHILE 条件 DO
	SQL逻辑
END WHILE;
-- 计算从1累加到N的值
CREATE PROCEDURE p3(IN n INT, OUT total INT)
BEGIN
	DECLARE result int DEFAULT 0;
	
	WHILE n > 0 DO
		SET result := result + n;
		SET n := n - 1; 
	END WHILE;
	
	SET total := result;
END;

SET @n := 10;
CALL p3(@n, @total);

SELECT @total;

注意:WHILE中使用OUT变量输出为NULL,如果想要输出,可以先定义一个局部变量最后计算完成之后在设置输出变量。

八、repeat循环

repeat循环是有条件的循环控制语句。满足条件后,退出循环

# 先执行一次逻辑,然后判断逻辑是否满足,如果满足则退出,如果不满足,则继续下一个循环。
REPEAT 
	SQL逻辑
	UNTIL 条件
END REPEAT
-- 计算从1累加到N的值
CREATE PROCEDURE p4(IN n INT, OUT total INT)
BEGIN
	DECLARE result int DEFAULT 0;
	
	REPEAT
		SET result := result + n;
		SET n := n - 1; 
	UNTIL n <= 0 END REPEAT;

	
	SET total := result;
END;

SET @n := 10;
CALL p4(@n, @total);

SELECT @total;

九、loop循环

LOOP实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用来实现简单的死循环。
LOOP可以配合两个语句一起使用:

  • LEAVE: 配合循环使用,退出循环
  • ITERATE:必须用在循环中,跳过本次循环执行下一次循环
[begin_label] LOOP
	SQL逻辑
END LOOP [end_label];
LEAVE label; -- 退出循环
ITERATE label;  -- 退出本次循环执行下一次循环
CREATE PROCEDURE p5(IN n INT, OUT total INT)
BEGIN
	DECLARE result int DEFAULT 0;
	
	sum:LOOP
		IF n <= 0 THEN LEAVE sum; END IF;
		SET result := result + n;
		SET n := n - 1; 
	END LOOP sum;
	
	SET total := result;
END;

SET @n := 10;
CALL p5(@n, @total);

SELECT @total;
CREATE PROCEDURE p6(IN n INT, OUT total INT)
BEGIN
	DECLARE result int DEFAULT 0;
	
	sum:LOOP
		IF n <= 0 THEN LEAVE sum; END IF;
		IF n%2 = 1 THEN 
			SET n := n - 1; 
			ITERATE sum; 
		END IF;
		SET result := result + n;
		SET n := n - 1; 
	END LOOP sum;
	
	SET total := result;
END;

SET @n := 10;
CALL p6(@n, @total);

SELECT @total;

十、游标

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

声明游标

DECLARE 游标名称 CURSOR FOR 查询语句;

打开游标

OPEN 游标名称;

获取游标记录

FETCH 游标名称 INTO 变量;

关闭游标

CLOSE 游标名称;
-- 根据年龄查询用户数据,并将用户名跟专业插入到新表中
CREATE PROCEDURE p1(IN uage INT)
BEGIN
	-- 注意:变量一定要声明在游标之前
	DECLARE uname VARCHAR(50);
	DECLARE uprof VARCHAR(50);
	
	DECLARE u_cursor CURSOR FOR SELECT name,profession FROM tb_user WHERE age <= uage;
	
	
	DROP TABLE IF EXISTS tb_user_pro;
	CREATE TABLE IF NOT EXISTS tb_user_pro(
		id int PRIMARY KEY auto_increment,
		name VARCHAR(50) COMMENT '姓名',
		profession VARCHAR(50) COMMENT '专业'
	);
	
	OPEN u_cursor;
	
	WHILE TRUE DO
		FETCH u_cursor INTO uname,uprof;
		
		INSERT tb_user_pro(name, profession) VALUES(uname,uprof);
	END WHILE;
	
	CLOSE u_cursor;
END;

CALL p1(35);

十一、条件处理程序

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

DECLARE handler_action HANDLER FRO condition_value [, condition_value] ... statement;

handler_action 
	CONTINUE: 继续执行当前程序
	EXIT: 终止执行当前程序
condition_value 
	SQLSTATE sqlstate_value: 状态码,如 02000
	SQLWARNING: 所有以01开头的SQLSTATE代码的简写
	NOT FOUND: 所有以02开头的SQLSTATE代码的简写
	SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND 捕获的SQLSTATE代码的简写
-- 根据年龄查询用户数据,并将用户名跟专业插入到新表中
CREATE PROCEDURE p2(IN uage INT)
BEGIN
	DECLARE uname VARCHAR(50);
	DECLARE uprof VARCHAR(50);
	
	DECLARE u_cursor CURSOR FOR SELECT name,profession FROM tb_user WHERE age <= uage;
	
	DECLARE EXIT HANDLER FOR NOT FOUND CLOSE u_cursor;
	
	DROP TABLE IF EXISTS tb_user_pro;
	CREATE TABLE IF NOT EXISTS tb_user_pro(
		id int PRIMARY KEY auto_increment,
		name VARCHAR(50) COMMENT '姓名',
		profession VARCHAR(50) COMMENT '专业'
	);
	
	OPEN u_cursor;
	
	WHILE TRUE DO
		FETCH u_cursor INTO uname,uprof;
		
		INSERT tb_user_pro(name, profession) VALUES(uname,uprof);
	END WHILE;
	
	CLOSE u_cursor;
END;

CALL p2(35);

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

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

相关文章

自动化学习3:日志记录及测试报告的生成--自动化框架搭建

一.日志记录 1.配置文件pytest.ini&#xff1a;将日志写入文件方便日后查询或查看执行信息。 需要将文件处理器&#xff08;文件存放位置/时间/格式等等&#xff09;添加到配置文件中的【日志记录器】 # pytest.ini [pytest] # ---------------日志文件&#xff0c;需要配合…

虚拟机使用FileZilla软件实现文件互传

软件版本&#xff1a;FizeZilla 3.63.2 VirtualBox7.0.20 1.设置桥接模式(网卡) 2.查看ip 在控制台输入ifconfig 3.在终端打开控制台安装FTP服务 sudo apt-get install vsftpd 等待软件自动安装&#xff0c;安装完成以后使用 VI命令打开 /etc/vsftpd.conf&#xff0c;命令…

8086的指令系统

今天上午综测答辩结束&#xff0c;感觉就很一般&#xff0c;但是我昨晚也操心到觉都没睡好&#xff0c;今天中午舍友玩P5吵得我也没睡着&#xff0c;感觉脑袋昏昏沉沉&#xff0c;汇编上课没认真听讲&#xff0c;晚上来补一补。还是采用GPT来讲解&#xff08;水文字&#xff09…

Unity开发绘画板——02.创建项目

1.创建Unity工程 我们创建一个名为 DrawingBoard 的工程&#xff0c;然后先把必要的工程目录都创建一下&#xff1a; 主要包含了一下几个文件夹&#xff1a; Scripts &#xff1a;存放我们的代码文件 Scenes &#xff1a;工程默认会创建的&#xff0c;存放场景文件 Shaders &…

9.22日常记录

1.memccpy函数 memccpy是一个用于内存复制的函数&#xff0c;它的原型通常在<cstring>&#xff0c;memccpy函数的作用是从源内存区域复制字节到目标内存区域&#xff0c;直到遇到特定的字符或者复制了指定数量的字节为止。 返回值: 如果在复制过程中找到了指定的字符&am…

科大讯飞智能体Python SDK接入流程

第一步&#xff1a;注册账号​ 进入https://passport.xfyun.cn/login&#xff0c;根据提示注册或登陆账号。 ​ 第二步&#xff1a;创建智能体 进入这个网页创建智能体&#xff0c;填好信息&#xff1a; https://xinghuo.xfyun.cn/botcenter/createbot?createtrue&qu…

lkhgjfjghkbhjk

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

http增删改查四种请求方式操纵数据库

注意&#xff1a;在manage.py项目入口文件中的路由配置里&#xff0c;返回响应的 return语句后面的代码不会执行&#xff0c;所以路由配置中每个模块代码要想都执行&#xff0c;不能出现return 激活虚拟环境&#xff1a;venv(我的虚拟环境名称&#xff09;\Scripts\activate …

ubuntu下检查端口是否占用问题,编写shell脚本检查端口是否占用

1.创建脚本 touch check_port.sh2.粘贴以下内容到check_port.sh中 #!/bin/bash# 检查端口是否被占用的函数 check_port() {local port80local result$(sudo lsof -i:$port)if [[ -z "$result" ]]; thenecho "端口 $port 未被占用。"elseecho "警告:…

水电站/水库大坝安全监测系统完整解决方案

一、背景 在当今社会&#xff0c;随着全球对清洁能源需求的日益增长&#xff0c;水电站作为可再生能源的重要组成部分&#xff0c;其安全稳定运行显得尤为重要。水电站&#xff0c;尤其是大型水库大坝&#xff0c;不仅承载着发电、防洪、灌溉等多重功能&#xff0c;还直接关系…

二分查找法求解一元三次方程组

本题使用二分查找求解 #include <iostream> #include <algorithm> #include <cmath> using namespace std;double a,b,c,d;// 求出方程的值 double f(double x) {return a*pow(x,3)b*pow(x,2)c*xd; }void find(double l,double r) {// 若精度在可控范围内…

每日一练:二叉树的层序遍历

102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,n…

Python常见Json对比库deepdiff、json_tools、jsonpatch

对比两个json对象差异&#xff0c;常见的第三方对比库deepdiff、json_tools、jsonpatch都能够满足我们的需求。 用法&#xff1a; deepdiff from deepdiff import DeepDiffa {"name": "yanan", "pro": {"sh": "shandong"…

【微服务即时通讯系统】——etcd一致性键值存储系统,etcd的介绍,etcd的安装,etcd使用和功能测试

文章目录 etcd1. etcd的介绍1.1 etcd的概念 2. etcd的安装2.1 安装etcd2.2 安装etcd客户端C/C开发库 3. etcd使用3.1 etcd接口介绍 4. etcd使用测试4.1 原生接口使用测试4.2 封装etcd使用测试 etcd 1. etcd的介绍 1.1 etcd的概念 Etcd 是一个基于GO实现的 分布式、高可用、一致…

第十五章 文件上传

目录 一、文件上传注意点 二、JavaWeb上传文件的核心 三、常规的JavaWeb上传实现 四、运行效果 一、文件上传注意点 1. 为保证服务器安全&#xff0c;上传文件应该放在外界无法直接访问的目录下&#xff0c;比如放于WEB-INF目录下。 2. 为防止文件覆盖的现象发生&#xff…

[万字长文]stable diffusion代码阅读笔记

stable diffusion代码阅读笔记 获得更好的阅读体验可以转到我的博客y0k1n0的小破站 本文参考的配置文件信息: AutoencoderKL:stable-diffusion\configs\autoencoder\autoencoder_kl_32x32x4.yaml latent-diffusion:stable-diffusion\configs\latent-diffusion\lsun_churches-ld…

Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)

Unity 3D GUI 简介 游戏开发过程中&#xff0c;开发人员往往会通过制作大量的图形用户界面&#xff08; Graphical User Interface&#xff0c;GUI &#xff09;来增强游戏与玩家的交互性。 Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI等&#xff0c;这些类型的图形系统内容…

springboot项目引入了第三方jar包

应该把jar包放在resource目录下&#xff0c;新建一个lib目录放进去&#xff0c;不然打包的时候会报错找不到jar包&#xff0c;放入jar包&#xff0c;右键添加到库&#xff0c;才可以使用。 _g().startMarquee();

解决方案 | 镭速助力动漫游戏行业突破跨网文件交换瓶颈

在数字化浪潮推动下&#xff0c;动漫游戏行业蓬勃发展。随着高清技术的普及和云游戏的兴起&#xff0c;动漫游戏行业对动画的画质要求越来越高&#xff0c;数据量呈现爆炸式增长。然而&#xff0c;行业内的跨网文件交换难题也日益凸显&#xff0c;成为制约行业发展的瓶颈。 行业…

RTE大会报名丨 重塑语音交互:音频技术和 Voice AI,RTE2024 技术专场第一弹!

Voice AI 实现 human-like 的最后一步是什么&#xff1f; AI 视频爆炸增长&#xff0c;新一代编解码技术将面临何种挑战&#xff1f; 当大模型进化到实时多模态&#xff0c;又将诞生什么样的新场景和玩法&#xff1f; 所有 AI Infra 都在探寻规格和性能的最佳平衡&#xff0…