- MySQL - 存储过程 Stored Procedure

article/2025/8/25 0:35:49

文章目录

      • 存储过程是什么
      • 存储过程的优点
      • 存储过程的缺点
      • 存储过程分类
      • 存储过程的查询语句
      • 存储过程的创建和调用
        • 语法
        • 实例 - IN、OUT、INOUT
        • 条件语句
        • 循环语句
        • 迭代


存储过程是什么

存储过程是一组为了完成特定功能的SQL语句集,存储在数据库中,一次编译多次使用,用户通过指定存储过程的名字并传入必要的参数来调用执行它;

存储过程就是数据库语言层面的代码封装与重用;


存储过程的优点

  • 将重复性很高、复杂的一些操作,封装到一个存储过程中,简化了对这些SQL的调用;
  • 可以重复使用,减少数据库开发人员的工作量;
  • 一次编译多次调用执行,可以提高数据库执行速度;
    存储过程只在创建的时候进行编译,以后每次调用的时候不需要再编译,一般的SQL语句每次执行都要先编译;
  • 可以使用SQL+循环进行批处理;
  • 存储过程存放在服务器上,调用的时候只需要传递存储过程的名称和必要的参数就可以了,降低了网络传输的数据量;
  • 参数化的存储过程可以防止SQL注入,也可以给存储过程设置权限,确保了数据的安全;

存储过程的缺点

  • 可移植性差:不同数据库的存储过程的语法不同,切换数据库时需要重新编写存储过程;
  • 每个数据库的存储过程语法几乎都不一样,十分难以维护(不通用);
  • 调试麻烦;

存储过程分类

1、系统存储过程:以sp_开头,用来进行系统的各项设定、取得信息、相关管理工作;

2、本地存储过程:一般说的存储过程就是本地存储过程,是由用户创建的,用来完成某一特定功能;

3、临时存储过程:(sql server)
本地临时存储过程:以#作为名称的开头;只有创建的用户自己能使用;
全局临时存储过程:以##作为名称的开头;连接到数据库服务器的用户都能调用;

4、远程存储过程:(sql server)

5、扩展存储过程:用户可以使用外部程序语言编写的存储过程,名字通常以xp开头;


存储过程的查询语句

查看某个数据库下面的存储过程:
select pName from mysql.proc where db='数据库名';
select routine_name from information_schema.routines where routine_schema='数据库名';
show procedure status where db='数据库名';

查看存储过程的详细信息:show create procedure dbName.pName;

修改存储过程:alter procedure procedureName;

删除存储过程:drop procedure procedureName;


存储过程的创建和调用

https://www.runoob.com/w3cnote/mysql-stored-procedure.html

语法

delimiter $$create  [definer = { user | current_user}] procedure  sp_name (in/out/inout  参数名  参数类型)[characteristic ...] routine_bodycharacteristic:comment  'string'| LANGUAGE SQL| [NOT] DETERMINISTIC| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }routine_body:Valid SQL routine statement[begin_label:] BEGIN[statement_list]……
END [end_label]delimiter ;

1、delimiter $$:修改语句结束符;
语句结束符表示语句已经结束,MySQL可以执行语句了;

在定义存储过程前,将语句结束符临时修改为$$(符号随意定),使得存储过程的过程体中使用的;被直接传递到服务器,而不会被客户端解释;
存储过程结束后,要将语句结束符改为默认的;delimiter ;


2、create procedure p_name(IN/OUT/INOUT p_in int, ...):声明存储过程;
默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀;

如果过程没有参数,也必须在过程名后面写上小括号;

  • IN: 输入参数,表示调用者向过程传入值;
    用来接收调用者调用存储过程时传入的参数;可以传入字面值、或变量;
  • OUT:输出参数,表示调用者向过程传入值;
    用来向调用者返回值,传出值只能是变量;
  • INOUT:输入输出参数,既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量);尽量少使用inout;

3、begin ... end$$:定义存储过程体;

  • 存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等;
  • 过程体格式:以begin开始,以end结束(可嵌套);
  • 可以为语句块帖标签:增强代码的可读性,在某些语句(例如:leave和iterate语句),需要用到标签;
    在这里插入图片描述

4、set @p_in=1;:变量赋值;


5、declare id int unsigned default 100;:声明变量;
过程体中声明的是局部变量,直接使用sql语句声明的是全局变量;使用set为变量赋值时,在过程体中修改变量的值,不影响全局变量的值;


6、call pName(参数列表);:调用存储过程;


7、变量的作用域:
内部的变量在其作用域范围内享有更高的优先权,当执行到 end 变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是可以通过 out 参数或者将其值指派给会话变量来保存其值;


实例 - IN、OUT、INOUT

1、删除给定球员参加的所有比赛:

mysql> delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)-> BEGIN->   DELETE FROM MATCHES  WHERE playerno = p_playerno;-> END$$
Query OK, 0 rows affected (0.01 sec) 
mysql> delimiter;  #将语句的结束符号恢复为分号

2、IN 输入参数:

mysql> delimiter $$
mysql> create procedure in_param(in p_in int)-> begin->   select p_in;->   set p_in=2;->    select P_in;-> end$$
mysql> delimiter ; 
mysql> set @p_in=1; 
mysql> call in_param(@p_in);
输出12
mysql> select @p_in;
输出1

以上可以看出,p_in 在存储过程中被修改,但并不影响 @p_id 的值,因为前者为局部变量、后者为全局变量;

3、OUT 输出参数:

mysql> delimiter //
mysql> create procedure out_param(out p_out int)->   begin->     select p_out;->     set p_out=2;->     select p_out;->   end //
mysql> delimiter ;
mysql> set @p_out=1; 
mysql> call out_param(@p_out);先输出NULL,因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null再输出2,因为过程体中使用set为输出参数赋值为2; 
mysql> select @p_out;输出2;调用了out_param存储过程,输出参数,改变了p_out变量的值;

4、INOUT 输入输出参数:

mysql> delimiter $$
mysql> create procedure inout_param(inout p_inout int)->   begin->     select p_inout;->     set p_inout=2;->     select p_inout;->   end-> $$
mysql> delimiter ; 
mysql> set @p_inout=1; 
mysql> call inout_param(@p_inout);输出12 
mysql> select @p_inout;输出2
#调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量

5、变量定义与赋值:

  • 在客户端使用变量:
    在这里插入图片描述
  • 在存储过程中使用用户变量:
    在这里插入图片描述
  • 在存储过程间传递全局范围的用户变量:
    在这里插入图片描述

条件语句

1、if-then-else 语句:

mysql > DELIMITER //  
mysql > CREATE PROCEDURE proc2(IN parameter int)  -> begin -> declare var int;  -> set var=parameter+1;  -> if var=0 then -> insert into t values(17);  -> end if;  -> if parameter=0 then -> update t set s1=s1+1;  -> else -> update t set s1=s1+2;  -> end if;  -> end;  -> //  
mysql > DELIMITER ;

2、case语句:

mysql > DELIMITER //  
mysql > CREATE PROCEDURE proc3 (in parameter int)  -> begin -> declare var int;  -> set var=parameter+1;  -> case var  -> when 0 then   -> insert into t values(17);  -> when 1 then   -> insert into t values(18);  -> else   -> insert into t values(19);  -> end case;  -> end;  -> //  
mysql > DELIMITER ; 
casewhen var=0 theninsert into t values(30);when var>0 thenwhen var<0 thenelse
end case

循环语句

1、while ···· end while

while 条件 do--循环体
endwhilemysql > DELIMITER //  
mysql > CREATE PROCEDURE proc4()  -> begin -> declare var int;  -> set var=0;  -> while var<6 do  -> insert into t values(var);  -> set var=var+1;  -> end while;  -> end;  -> //  
mysql > DELIMITER ;

2、repeat···· end repea:在执行操作后检查结果,而 while 则是执行前进行检查;

repeat--循环体
until 循环条件  
end repeat;mysql > DELIMITER //  
mysql > CREATE PROCEDURE proc5 ()  -> begin   -> declare v int;  -> set v=0;  -> repeat  -> insert into t values(v);  -> set v=v+1;  -> until v>=5  -> end repeat;  -> end;  -> //  
mysql > DELIMITER ;

3、loop ·····endloop:loop 循环不需要初始条件,这点和 while 循环相似,同时和 repeat 循环一样不需要结束条件, leave 语句的意义是离开循环;

mysql > DELIMITER //  
mysql > CREATE PROCEDURE proc6 ()  -> begin -> declare v int;  -> set v=0;  -> LOOP_LABLE:loop  -> insert into t values(v);  -> set v=v+1;  -> if v >=5 then -> leave LOOP_LABLE;  -> end if;  -> end loop;  -> end;  -> //  
mysql > DELIMITER ;

4、LABLES 标号:标号可以用在 begin repeat while 或者 loop 语句前,语句标号只能在合法的语句前面使用;可以跳出循环,使运行指令达到复合语句的最后一步;

迭代

ITERATE 通过引用复合语句的标号,来从新开始复合语句:

mysql > DELIMITER //  
mysql > CREATE PROCEDURE proc10 ()  -> begin -> declare v int;  -> set v=0;  -> LOOP_LABLE:loop  -> if v=3 then   -> set v=v+1;  -> ITERATE LOOP_LABLE;  -> end if;  -> insert into t values(v);  -> set v=v+1;  -> if v>=5 then -> leave LOOP_LABLE;  -> end if;  -> end loop;  -> end;  -> //  
mysql > DELIMITER ;

MySQL存储过程学习使用之创建、修改、删除、调用


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

相关文章

mysql的delete语句_mysql删除语句

展开全部 mysql删除语句如下&#xff1a; 1、delete删除一行&#xff1a;delete from student where id1。 2、delete删除多行&#xff1a;delete from student where in (1,2,3)3。 3、删62616964757a686964616fe78988e69d8331333433623162除表的所有数据&#xff1a;delete f…

mysql any all some

假设现在有两张表 a &#xff0c; b 如下 SELECT * FROM a WHERE id > ANY(SELECT id FROM b )# any 等价于 some 这里有两个id sql的意思大概是查询a表的所有&#xff0c;在where中a的id > 子表 b的id 这里用到了any(some) 他们的意思是一样的&#xff0c;就是说a表…

mysql 的 sql_mode.only_full_group_by属性解析

文章目录 1. 初始条件2. 现象3. 解决①&#xff1a;关闭sql_mode 的 only_full_group_by模式②&#xff1a;使用 ANY_VALUE() 抑制 ONLY_FULL_GROUP_BY 的影响 mysql8.0官网&#xff1a;处理 group by 1. 初始条件 现在有这样一张表&#xff0c;其中有两条 name 裤子 的数据…

MYSQL 删除语句

删除数据(DELETE) 如果你失忆了&#xff0c;希望你能想起曾经为了追求梦想的你。 数据库存储数据&#xff0c;总会有一些垃圾数据&#xff0c;也会有一些不需要用的数据了&#xff0c;这些情况下&#xff0c;我们就可以删除这些数据&#xff0c;释放出一定的空间&#xff0c;给…

MySql递归RECURSIVE的详解

背景&#xff1a; 在实际开发的过程中&#xff0c;我们会遇到一些数据是层级关系的、要展示数据子父级关系的时候&#xff0c; 第一个解决方案&#xff1a;将数据库中的所有数据都查询出来用Java代码进行处理。 第二个解决方案&#xff1a;可以考虑MySql中的RECURSIVE递归进行…

【MYSQL WITH recursive使用】

MYSQL WITH recursive使用 MYSQL WITH recursive使用语法用法1&#xff1a;输出1~n或者求 1~n的和用法2 父求子创建table&#xff1a;user求张三后代 MYSQL WITH recursive使用 由于在项目中有使用到recursive&#xff0c;因此在此做记录 语法 WITH recursive 表名 AS ( 初始…

U 盘安装 CentOS7 时盘符和安装源不可用问题

记录一次在物理机上安装 CentOS7 遇到的问题及其解决办法&#xff0c;主要有两个问题卡住了很久&#xff0c;一个是盘符问题&#xff0c;一个就是安装源不可用的问题 。 1 No such device 1.1 问题描述 用 U 盘在物理机上安装 CentOS7 的时候&#xff0c;出现 could not ins…

Vmware Workstation17 安装centos7(详细教程)

1、为什么安装Vmware Vmware Workstation可以帮我们他们创建虚拟机&#xff0c;模拟生产环境(linux)&#xff0c;搭建集群等。作为一个开发人员特别是后端开发人员是需要懂一些运维的&#xff0c;不需要精通&#xff0c;遇到问题能定位排查。我自己想做一个自己的项目&#xf…

用大白菜装centos7_大白菜安装centos7 踩坑记

1.准备一个U盘,安装大白菜。这个去大白菜官网下载安装就可以了 安装大白菜的时候最好选择FAT32(2021.1.7记录) 2.U盘装完大白菜后U盘会被分为两个主分区 一个盘是大白菜系统的,另外一个盘放一些工具的。 DBC里面就是放的一些工具 比如磁盘管理工具 3.把Centos7的镜像放入到DB…

Windows10安装Centos7双系统

Windows10安装Centos7双系统 1.摘要2.制作Centos 7系统盘3.Windows磁盘管理为Centos系统留出空间4.bios配置使得计算机系统选择从U盘进入5.安装Centos 7系统6.如何在Windows和Centos系统间切换7.一些问题与补救方法8.参考文章 1.摘要 本篇博客主要整理记录了在Win10 OS下安装使…

VM16上安装CentOS7详细安装教程【附图】

在VM16上安装Centos7 下载Centos安装Centos快照拍摄 下载Centos 进入Centos官网 Centos官网的下载地址 点击Download 点击x86_64 自己选择镜像下载 上面选择好自己的镜像后选择后缀名为 iso 的CentOS下载 安装Centos 点击创建新的虚拟机 选择好自定义后点击下一步…

VMware 16安装centos 7详细教程

VMware 16安装centos 7详细教程 前言&#xff1a;之前在VMware15 pro上安装centos7&#xff0c;但是启动虚拟机出现蓝屏&#xff0c;身边有好多小伙伴也遇到了这个问题&#xff0c;经过一番排查&#xff0c;找到了最简单的办法就是升级到VMware16pro&#xff0c;在启动就没有出…

在Vmware虚拟机中安装CentOS 7

前言&#xff1a;材料和工具 1. 安装好的VMWare虚拟机软件&#xff1a; ​VMWare16下载地址&#xff0c;获取码&#xff1a;ye1a 2.CentOS7下载地址&#xff1a;官方镜像下载 (centos.org) &#xff08;官方镜像站下载比较慢&#xff09; 清华大学镜像站&#xff1a;清华…

物理服务器安装CentOS 7操作系统

目录 1、下载系统镜像 2、制作安装盘 2.1 方法一&#xff1a;光盘制作 2.2 方法二&#xff1a;U盘制作 3、更改bios启动顺序 4、安装CentOS 7操作系统 4.1 安装命令选择&#xff0c;及常见错误解决 4.2 语言选择 4.3 时区选择 4.4 软件选择 4.5 安装位置选择 4.6 手…

M1芯片Macbook虚拟机安装centos7

目录 一、安装parallels Desktop、centos7 二、安装Parallels Tools 三、安装VNC server服务 四、进程占用问题 一、安装parallels Desktop、centos7 由于centon7内核版本问题用PD18等版本安装centos7进入默认是命令行安装。 命令界面安装&#xff1a; 1、选数字5 回车 再…

虚拟机安装centos7

1、简介 这里虚拟机采用VMware15.1.0&#xff0c;镜像采用CentOS7版本&#xff0c;官网或国内镜像可直接下载。 https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 2、安装流程 1、打开vmware软件&#xff0c;点击 创建新的虚拟机。 2、选择 典…

Mac(2) Parallels Desktop 安装 CentOS7

文章目录 一、前言二、准备三、Parallels Desktop安装CentOS7四、CentOS7配置1、网络配置 -- 设置固定ip2、关闭防火墙3、关闭SELinux4、更新yum源5、安装ifconfig6、其它 一、前言 本文将通过Parallels Desktop安装CentOS7 二、准备 Parallels Desktop下载安装 https://www…

vm安装centos7蓝屏

vm安装centos7蓝屏 最近有同学购买了最新款英特尔11代的笔记本&#xff0c;使用vm安装centos7系统&#xff0c;一启动虚拟机就系统蓝屏&#xff0c;今天给后来的同学们找一下坑吧。 系统&#xff1a;最新版win10 软件&#xff1a;vm16.0 链接&#xff1a;【百度云】 提取码&am…

Docker 安装 CentOS7

Docker 安装 CentOS 前言一、查看可用的 CentOS 版本二、安装1、拉取指定版本的 CentOS 镜像&#xff0c;这里我们安装指定版本为例(centos7):2、查看本地镜像&#xff0c;验证是否安装成功2、运行容器3、进入到Centos容器4.安装ssh服务和网络必须软件A、安装完后重启SSH服务:B…

Mac M1安装Centos7

一、安装PD虚拟机 地址&#xff1a;https://macwk.com/soft/parallels-desktop-for-arm 二、下载centos (arm64)镜像 地址&#xff1a;https://www.aliyundrive.com/s/ZGVA2Mfkm2q 提取码: 4b9d **注意&#xff1a;**因网盘分享文件类型限制&#xff0c;这里下载镜像后需要把…