MySQL:进阶巩固-存储过程

目录

    • 一、存储过程的概述
    • 二、存储过程的基本使用
      • 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()
BEGINSELECT 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()
BEGINDECLARE 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()
BEGINDECLARE age int DEFAULT 18;DECLARE result VARCHAR(10);IF age < 18 THENSET result := '小孩';ELSEIF age >=18 AND age <= 35 THENSET result := '青年';ELSESET 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))
BEGINIF age < 18 THENSET result := '小孩';ELSEIF age >=18 AND age <= 35 THENSET result := '青年';ELSESET result := '老年';END IF;
END;
-- 执行存储过程
CALL p4(18, @result);
-- 查看返回结果
SELECT @result;

输入、输出参数

CREATE PROCEDURE p5(INOUT score DOUBLE)
BEGINSET score := score * 0.5;
END;SET @score = 80;
CALL p5(@score);
SELECT @score;

六、CASE判断

语法一:

CASE case_valueWHEN when_value1 THEN statement_list1WHEN when_value2 THEN statement_list2...ELSE statement_list
END CASE;

语法二:

CASEWHEN search_condition1 THEN statement_list1WHEN 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))
BEGINCASE WHEN month >= 1 AND month <=3 THENSET result := '第一季度';WHEN month >= 4 AND month <=6 THENSET result := '第二季度';WHEN month >= 7 AND month <=9 THENSET result := '第三季度';WHEN month >= 10 AND month <=12 THENSET result := '第三季度';ELSESET result := '你家有这个月份啊!';END CASE;
END;SET @month := 6;
CALL p6(@month, @result);
SELECT CONCAT('您输入的月份为:', @month, ' 所属季度为:', @result)

七、While循环

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

# 先判断条件,如果条件为True,则执行逻辑,否则不执行逻辑
WHILE 条件 DOSQL逻辑
END WHILE;
-- 计算从1累加到N的值
CREATE PROCEDURE p3(IN n INT, OUT total INT)
BEGINDECLARE result int DEFAULT 0;WHILE n > 0 DOSET 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)
BEGINDECLARE result int DEFAULT 0;REPEATSET 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] LOOPSQL逻辑
END LOOP [end_label];
LEAVE label; -- 退出循环
ITERATE label;  -- 退出本次循环执行下一次循环
CREATE PROCEDURE p5(IN n INT, OUT total INT)
BEGINDECLARE result int DEFAULT 0;sum:LOOPIF 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)
BEGINDECLARE result int DEFAULT 0;sum:LOOPIF 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 DOFETCH 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: 状态码,如 02000SQLWARNING: 所有以01开头的SQLSTATE代码的简写NOT FOUND: 所有以02开头的SQLSTATE代码的简写SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND 捕获的SQLSTATE代码的简写
-- 根据年龄查询用户数据,并将用户名跟专业插入到新表中
CREATE PROCEDURE p2(IN uage INT)
BEGINDECLARE 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 DOFETCH 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.mzph.cn/bicheng/55239.shtml

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

相关文章

spring boot项目对接人大金仓

先确认一下依赖 第一 是否引入了mybatis-plus多数据源&#xff0c;如果引入了请将版本保持在3.5.0以上 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${dynam…

LeetCode 热题 100 回顾18

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

Python库matplotlib之五

Python库matplotlib之五 小部件(widget)RangeSlider构造器APIs应用实列 TextBox构造器APIs应用实列 小部件(widget) 小部件(widget)可与任何GUI后端一起工作。所有这些小部件都要求预定义一个Axes实例&#xff0c;并将其作为第一个参数传递。 Matplotlib不会试图布局这些小部件…

探索高效免费的PDF转Word工具,开启便捷办公之旅

无论是为了方便对文档内容进行编辑、修改&#xff0c;还是为了更好地适应不同的工作和学习场景&#xff0c;将 PDF 文档转换为可编辑的 Word 格式都具有重要意义。今天我就分享几款pdf转换成word免费版工具来解决大家的困扰。 1.Foxit PDF转换大师 链接一下>>https://w…

[ RK3566-Android11 ] 关于移植 RK628F 驱动以及后HDMI-IN图像延迟/无声等问题

问题描述 由前一篇文章https://blog.csdn.net/jay547063443/article/details/142059700?fromshareblogdetail&sharetypeblogdetail&sharerId142059700&sharereferPC&sharesourcejay547063443&sharefromfrom_link&#xff0c;移植HDMI-IN部分驱动后出现&a…

taobao.item_get_appAPI接口原app数据测试指南

在电商竞争日益激烈的当下&#xff0c;数据成为了商家们争夺市场的重要武器。淘宝&#xff0c;作为中国最大的在线零售平台&#xff0c;其庞大的商品库和用户群体为商家提供了巨大的商机。为了帮助商家更好地了解市场动态&#xff0c;优化库存和营销策略&#xff0c;淘宝推出了…

使用WebClient 快速发起请求(不使用WebClientUtils工具类)

使用WebClient发起网络请求_webclient工具类-CSDN博客文章浏览阅读717次&#xff0c;点赞9次&#xff0c;收藏8次。使用WebClient发起网络请求_webclient工具类https://blog.csdn.net/qq_43544074/article/details/137044825这个是使用工具类发起的&#xff0c;下面就不使用工具…

java基础(4)类和对象

目录 1.前言 2.正文 2.1类的定义与使用 2.1.1类的定义 2.1.2类的实例化 2.1.3this引用 2.1.3.1 访问当前对象的成员变量 2.1.3.2调用当前对象的成员方法 2.1.3.3构造函数中的 this 2.1.3.4归纳this 2.2封装 2.2.1封装的定义 2.2.2访问修饰符 2.3static 2.3.1sta…

“卷”智能, 从高质量算力开始

算力即国力&#xff0c;这已是产业共识。 当人工智能浪潮席卷全球之际&#xff0c;大家深刻感受到发展算力产业的重要性和紧迫性&#xff0c;高质量的人工智能算力已经与国家竞争、产业升级和企业转型息息相关。 去年&#xff0c;《算力基础设施高质量发展行动计划》的颁布&a…

网络安全中的 EDR 是什么:概述和功能

专业知识&#xff1a;EDR、XDR、NDR 和 MDR_xdr edr ndr-CSDN博客 端点检测和响应 (EDR) 是一种先进的安全系统&#xff0c;用于检测、调查和解决端点上的网络攻击。它可以检查事件、检查行为并将系统恢复到攻击前的状态。EDR 使用人工智能、机器学习和威胁情报来避免再次发生攻…

CentOS7 离线部署docker和docker-compose环境

一、Docker 离线安装 1. 下载docker tar.gz包 下载地址&#xff1a; Index of linux/static/stable/x86_64/ 本文选择版本&#xff1a;23.0.6 2.创建docker.service文件 vi docker.service文件内容如下&#xff1a; [Unit] DescriptionDocker Application Container Engi…

【MySQL】数据库的介绍以及数据库基础

目录 &#x1f333;介绍 &#x1f384;数据库操作 &#x1f6a9;显示当前数据库 &#x1f6a9;创建数据库 ​编辑&#x1f6a9;使用/选中 数据库 &#x1f6a9;删除数据库 &#x1f334;常用的数据类型 &#x1f6a9;数值类型 &#x1f6a9;字符串类型 &#x1f6a9…

【自用软件】IDM下载器 Internet Download Manager v6.42 Build 10

下载IDM&pj安装教程 Internet Download Manager&#xff0c;简称 IDM&#xff0c;是国外的一款优秀下载工具。目前凭借着下载计算的速度优势在外媒网站中均受好评&#xff0c;现在已被多数国人熟知。Internet Download Manager 提升你的下载速度最多达5倍&#xff0c;安排下…

【HarmonyOS】深入理解LocalStorage之逻辑处理存取

【HarmonyOS】深入理解LocalStorage 一、前言 鸿蒙应用中关于状态管理的处理机制有很多。从状态装饰器State prop等&#xff0c;LocalStrong&#xff0c;AppStrong到首选项&#xff0c;再到数据库。内存到持久化。轻量级到重量级。全方位覆盖。 学习和记忆技术点&#xff0c…

Java-数据结构-Map和Set-(二)-哈希表 |ू・ω・` )

文本目录&#xff1a; ❄️一、哈希表&#xff1a; ☑ 1、概念&#xff1a; ☑ 2、冲突-概念&#xff1a; ☑ 3、冲突-避免&#xff1a; ☞ 1&#xff09;、避免冲突-哈希函数的设计&#xff1a; ☞ 2&#xff09;、避免冲突-负载因子调节(重点)&#xff1a; ☑ 4、冲突-解决&…

那年我双手插兜,使用IPv6+DDNS动态域名解析访问NAS

估计有很多科技宅和我一样&#xff0c;会买一个NAS存储或者自己折腾刷一下黑群晖玩玩&#xff0c;由于运营商不给分配固定的公网IP&#xff0c;就导致我在外出的时候无法访问家里的NAS&#xff0c;于是远程访问常常受到IP地址频繁变动的困扰。为了解决这一问题&#xff0c;结合…

element 输入框文字+对应签进行长度 和 的判断

输入文字长度 指定标签的长度 &#xff08;判断长度并提示&#xff09; <div style"position: relative;" classchangyongyu><el-input type"textarea" :autosize"{ minRows: 8, maxRows: 8 }" style"margin-bottom:10px;"…

【React】useEffect

1. 基本介绍 概念 语法 副作用函数依赖项数组&#xff08;空数组时&#xff0c;只会在组件渲染完毕后执行一次副作用函数&#xff09; 2. 使用 import { useEffect, useState } from reactfunction App() {const [value, setValue] useState(0)useEffect(() > {console…

如何使用ssm实现小区物业管理系统

TOC ssm733小区物业管理系统jsp 第一章 绪论 1.1 研究背景 在现在社会&#xff0c;对于信息处理方面&#xff0c;是有很高的要求的&#xff0c;因为信息的产生是无时无刻的&#xff0c;并且信息产生的数量是呈几何形式的增加&#xff0c;而增加的信息如何存储以及短时间分析…

基于微信小程序的美食外卖管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…