MySQL数据库存储过程

article/2025/10/3 15:12:26

    • 存储过程相关命令汇总
    • 存储过程
    • 存储过程优化
    • 再说存储过程的输出参数
    • 再说WHILE 和 REPEAT循环

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
——百度百科

存储过程

如图所示,在普通模式下获取数据,用户需要输入SQL命令与数据库进行交互,而存储过程是编写好的SQL命令,存储在数据库中,用户操作的时候只需要调用存储过程,而不用重新输入冗余繁杂的SQL命令。因此

  • 存储过程有什么优点?
    1.存储过程可以重复使用,大大减小开发人员的负担;
    2.对于网络上的服务器,可以大大减小网络流量,因为只需要传递存储过程的名称即可;
    3,可以防止对表的直接访问,只需要赋予用户存储过程的访问权限。

0 存储过程相关命令汇总

操作SQL命令
创建存储过程CREATE PROCEDURE 存储过程名(参数种类1 参数1 数据类型1,[...] BEGIN 具体的procedure(处理) END
查看数据库中的存储过程SHOW PROCEDURE STATUS\G
查看具体的存储过程SHOW CREATE PROCEDURE 存储过程名\G
调用(执行)存储过程CALL 存储过程名(参数1,...);
删除存储过程DROP PROCEDURE 存储过程名
变量声明DECLARE 变量名 数据类型;
变量赋值SET 变量名= ;

1 存储过程

1.1 创建存储过程 CREATE PROCEDURE

创建存储过程的命令是:


>CREATE PROCEDURE 存储过程名(参数种类1 参数1 数据类型1,[...])BEGIN具体的procedure(处理)END
  • 1)存储过程中具体的处理类容放在 BEGINEND 之间;
  • 2)存储过程需要制定参数,包括种类( IN,OUT,INOUT ,分别代表输入参数,输出参数和即是输入也是输出的参数),参数名和数据类型。【和函数不同,函数指定输入参数即可】

eg:创建一个对表customer的姓名(nam)进行模糊检索,命名为sp_search_customer。

创建存储过程

对于上图创建PROCEDURE的几点说明:
>DELIMITER //表示给变分隔符,默认分隔符是;,否则存储过程中含有;,MySQL监视器无法分辨。(最后将分隔符改回来)
②存储过程( BEGINEND 之间)的具体处理内容,主要包括条件、case,循环。

分类SQL命令
简单条件IF cond1 THEN
    exp1
ELSEIF cond2 THEN
    exp2
ELSE
    expelse
END IF
caseCASE 表达式
    WHEN 值1 THEN …
    WHEN …THEN…
    ELSE …
END CASE
循环(后置判断)REPEAT

UNTIL …END REPEAT
循环(前置判断)WHILE … DO

END WHILE

**1.2 查看存储过程** 查看数据库中是否存在存储过程:

>SHOW PROCEDURE STATUS\G

查看存储过程的具体信息:

>SHOW CREATE PROCEDURE 存储过程名\G

eg:查看存储过程sp_search_customer

查看存储过程

1.3 执行存储过程 CALL
调用存储过程使用CALL 存储过程名命令,具体如下:

CALL 存储过程名(参数,...)

eg:通过创建好的存储过程sp_search_cusotmer来执行存储过程:
检索‘王’姓顾客:

>CALL sp_search_customer('王%');

检索所有顾客:

>CALL sp_search_customer('');

调用存储过程

1.4 删除存储过程 DROP PROCEDURE
删除存储过程使用命令:

DROP PROCEDURE 存储过程名;

2 存储过程优化

(1)使用if条件语句创建存储过程

if条件_存储过程

可以看到,上述条件语句部分的结构大致都为:

IF... THEN
SELECT...;
ELSEIF ...THEN
SELECT...;
ELSEIF...THEN
SELECT...;
ELSE
SELECT...;

其中的语句具有较高的重复性冗余性,因此比较繁琐,如果我们用CASE替代呢?
(2)CASE命令的多重分支

使用CASE来创建多重分支:

CASE_存储过程

p_dapart放到CASE之后,一个p_dapart取代了多个p_dapart,因此使用CASE代码在判断语句处显得简洁一些,如果通过定义变量的形式呢?

(3)定义本地变量

存储过程中定义的变量,被称为本地变量,对程序设计语言有所了解的知道这是一个局部变量。数据库中,
声明局部变量的命令:

>DECLARE 变量名 数据类型 [初始值...]

给变量赋值的命令:

>SET 变量名=

,在创建procedure过程中顶一个本地变量tem:

本地变量_存储过程

可以看到,这种方式大大地简化了代码的冗余性和重复性。

3 再说存储过程的输出参数

在创建存储过程的时候,如果制定了 OUTINOUT ,在调用存储过程时请在输出参数前面加上 @ ,这样结果将保存到“@变量名“中。

eg:创建一个计算阶乘的存储过程:

存储过程输出参数

最终的结果将保存到“@res“之中,如上图所示。

  • 请注意,用WHILE循环创建的计算阶乘的存储过程, !5=120,!0=1 ,结果是正确的。先记住这句话,接下来看下用REPEAT创建同样的阶乘计算的存储过程。

    4 再说WHILE 和 REPEAT循环

    我们使用repeat创建一个计算阶乘的存储过程:

    REPEAT_存储过程

    接下来看下同样计算 !5!0 结果如何?

    repeat_存储过程

    可以看到!5=120的结果正确,但是!0得到的结果为0,不为1。这是什么原因呢?
    问题出在WHILE是前置判断,是先验的,先验证WHILE后面的条件是否成立,为TRUE则继续执行,若FALSE则结束循环;
    而REPEAT是后置判断,是后验的,不管三七二十一先执行语句,然后验证UNTIL后面的条件语句是否成立,不成立则结束。因此REPEAT循环执行了一次 presult=presultpnumpresult=10
    因此:

    • WHILE循环是前置判断,先验的循环
    • REPEAT循环是后置判断,后验的循环

http://chatgpt.dhexx.cn/article/bqlbKvNp.shtml

相关文章

MySQL数据库存储过程讲解与实例

存储过程简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数&#x…

mysql数据库存储过程详解

1.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存…

MySQL中的存储过程(详细篇)

文章目录 概述优点缺点 MySQL存储过程的定义存储过程的基本语句格式存储过程的使用定义一个存储过程定义一个有参数的存储过程定义一个流程控制语句 IF ELSE定义一个条件控制语句 CASE定义一个循环语句 WHILE定义一个循环语句 REPEAT UNTLL定义一个循环语句 LOOP使用存储过程插…

跨域及cors解决跨域

1.什么是跨域 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的…

什么是跨域?如何解决跨域?

✨ 目录 🎈 什么是跨域🎈 跨域场景🎈 解决跨域的四种方式 🎈 什么是跨域 域: 是指浏览器不能执行其他网站的脚本跨域: 它是由浏览器的 同源策略 造成的,是浏览器对 JavaScript 实施的安全限制,…

关于跨域后端解决跨域问题

一、为什么会有跨域 出于浏览器的同源策略限制。**同源策略(Sameoriginpolicy)**是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。同源策略会阻止一个域的ja…

什么是跨域?跨域问题怎么解决?

目录 一、什么是跨域? 二、为什么会出现跨域问题? 三、常见的跨域场景 四、跨域解决方法 1、JSONP (1)JSONP原理 (2)JSONP和AJAX对比 (3)JSONP优缺点 (4&#x…

跨域的本质

简介 相信大家在做web系统开发的时候,都遇到过前端页面访问另一个服务器而非本服务器从而遭遇的跨域问题。跨域是个很常见的问题,虽然在web系统中的解决方式很简单,加一段耳熟能详的代码,或者一个注解,或者在某个框架中…

跨域及解决

文章目录 什么是跨域?Origin同源的例子不同源的例子为什么需要跨域?请求跨域了,那么请求到底发出去没有? 如何解决?1.JSONP2.corsa.简单请求b.复杂请求 3.postMessage4.websocket5.nginx6.document.domain Iframe cli…

什么是跨域?以及解决跨域的方法?

【学习什么是跨域,以及如何解决跨域。】 1、什么是跨域?(什么是同源策略?) 跨域: 由于浏览器的同源策略引起的,如果说协议、域名、端口号有任何一个不一样,都会引起跨域 为什么会出…

【跨域】Java后端解决跨域问题

废话不多说,先上完整代码 建corsConfig文件,copy下面内容,放进去 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfigur…

什么是同源策略,什么是跨域,如何解决跨域

1.什么是同源策略? 同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏览器,它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript 的浏览器都会使用这个策略。如果缺少…

前端解决跨域----代理跨域

跨域报错: CORS error 为什么会跨域 ​ 先了解跨域的概念:发送请求的url的协议、域名、端口三者之间任意一个与当前页面的地址不同则视为跨域。 解决跨域 vue.config.js 设置代理跨域 module.exports {devServer: {proxy: {/api: {target: "ht…

什么是跨域问题?跨域解决问题

一.为什么会出现跨域问题? 出于浏览器的同源策略限制.同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常的功能可能会受到影响,跨域收是Web是构建在同源策略基础上的,浏览器只是针对同源策略的一种实现,同源策略会阻止一个域的Jav…

什么是跨域及怎么解决跨域问题?

什么是跨域? 这篇博文解释的挺清楚,我直接引用 什么是跨域?怎么解决跨域问题?_L瑜-CSDN博客_跨域是什么意思 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全…

VUE跨域、常用解决跨域的方法

当我们遇到请求后台接口遇到 Access-Control-Allow-Origin 时,那说明跨域了。 跨域是因为浏览器的同源策略所导致,同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,同源是指&…

什么是跨域?怎么解决跨域问题

文章目录 一、同源策略二、同源策略案例三、什么是跨域四、跨域解决方法1.ajax的jsonp概念核心用法 2.CORS方式3.nginx 转发 一、同源策略 同源策略,是由 Netscape 提出的一个安全策略,它是浏览器最核心也是最基本的安全功能,如果缺少同源策…

什么是跨域以及为什么会出现跨域以及跨域的解决方案

1.什么是跨域? 跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。 • 同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产…

什么是跨域?如何解决?

一、什么是跨域? 跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。 例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同&#xf…

什么是跨域? 出现原因及解决方法

目录 一、什么是跨域二、为什么有跨域问题?三、解决跨域问题的方案1.Jsonp2.nginx3.CORS3.1 什么是cors3.2 原理 四、GateWay网关中实现跨域步骤 一、什么是跨域 跨域:浏览器对于javascript的同源策略的限制 。 同源政策的目的,是为了保证用…