MySQL中存储过程(详解,一篇就够了!!!)

一、MySQL中什么事存储过程?

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

MySQL 5.0 版本开始支持存储过程。

存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

优点

  • 存储过程可封装,并隐藏复杂的商业逻辑。
  • 存储过程可以回传值,并可以接受参数。
  • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
  • 存储过程可以用在数据检验,强制实行商业逻辑等。

缺点

  • 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  • 存储过程的性能调校与撰写,受限于各种数据库系统。
存储过程中的关键语法
DELIMITER // CREATE PROCEDURE CalculateSquare(IN num INT, OUT result INT) BEGIN SET result = num * num; END // DELIMITER ;
  • DELIMITER用于更改命令结束符,以便在存储过程中使用BEGIN ... END语句。通常,我们使用//作为新的结束符,并在存储过程定义结束后将其改回;
  • CREATE PROCEDURE用于创建新的存储过程。
  • CalculateSquare是存储过程的名称。
  • (IN num INT, OUT result INT)定义了输入和输出参数。在这个例子中,num是一个输入参数,result是一个输出参数。
  • BEGIN ... END之间的部分是存储过程的主体,即要执行的SQL语句。
调用存储过程

要调用上述存储过程并获取结果,你需要使用CALL语句,并指定一个变量来接收输出参数的值:

SET @input = 5; SET @output = 0; CALL CalculateSquare(@input, @output); SELECT @output; -- 输出应该是 25
声明存储过程:

CREATE PROCEDURE demo_in_parameter(IN p_in int)

变量赋值:

SET @p_in=1

变量定义:

DECLARE l_int int unsigned default 100000;

下面是存储过程的例子,删除给定球员参加的所有比赛:

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; #将语句的结束符号恢复为分号

以上代码:默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀。 在定义过程时,使用DELIMITER命令将语句的结束符号从分号 ; 临时改为两个 命令将语句的结束符号从分号;临时改为两个命令将语句的结束符号从分号;临时改为两个,使得过程体中使用的分号被直接传递到服务器,而不会被客户端(如mysql)解释。

调用存储过程:

call sp_name[(传参)];

二、存储过程的参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
1、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); +------+ | p_in | +------+ | 1 | +------+ +------+ | P_in | +------+ | 2 | +------+ mysql> select @p_in; +-------+ | @p_in | +-------+ | 1 | +-------+ 以上可以看出,p_in 在存储过程中被修改,但并不影响 @p_in 的值,因为前者为局部变量、后者为全局变量。
2、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); +-------+ | p_out | +-------+ | NULL | +-------+ #因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null +-------+ | p_out | +-------+ | 2 | +-------+ mysql> select @p_out; +--------+ | @p_out | +--------+ | 2 | +--------+ #调用了out_param存储过程,输出参数,改变了p_out变量的值
3、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); +---------+ | p_inout | +---------+ | 1 | +---------+ +---------+ | p_inout | +---------+ | 2 | +---------+ mysql> select @p_inout; +----------+ | @p_inout | +----------+ | 2 | +----------+ #调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量

**注意:**如果过程没有参数,也必须在过程名后面写上小括号例:

CREATE PROCEDURE sp_name ([proc_parameter[,…]]) ……

2、确保参数的名字不等于列的名字,否则在过程体中,参数名被当做列名来处理,建议如下:

  • 输入值使用in参数。
  • 返回值使用out参数。
  • inout参数就尽量的少用。

三、变量

在MySQL客户端使用用户变量:

mysql > SELECT 'Hello World' into @x; mysql > SELECT @x; +-------------+ | @x | +-------------+ | Hello World | +-------------+ mysql > SET @y='Goodbye Cruel World'; mysql > SELECT @y; +---------------------+ | @y | +---------------------+ | Goodbye Cruel World | +---------------------+ mysql > SET @z=1+2+3; mysql > SELECT @z; +------+ | @z | +------+ | 6 | +------+
在存储过程中使用用户变量
mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World'); mysql > SET @greeting='Hello'; mysql > CALL GreetWorld( ); +----------------------------+ | CONCAT(@greeting,' World') | +----------------------------+ | Hello World | +----------------------------+
在存储过程间传递全局范围的用户变量
mysql> CREATE PROCEDURE p1() SET @last_procedure='p1'; mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure); mysql> CALL p1( ); mysql> CALL p2( ); +-----------------------------------------------+ | CONCAT('Last procedure was ',@last_proc | +-----------------------------------------------+ | Last procedure was p1 | +-----------------------------------------------+

注意:

  • 1、用户变量名一般以@开头
  • 2、滥用用户变量会导致程序难以理解及管理

MySQL存储过程的调用

用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。

MySQL存储过程的查询

我们像知道一个数据库下面有那些表,我们一般采用showtables;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是另一钟方式。

我们可以用以下语句进行查询:

selectname from mysql.proc where db='数据库名'; 或者 selectroutine_name from information_schema.routines where routine_schema='数据库名'; 或者 showprocedure status where db='数据库名';

问题:

如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe 表名进行查看呢?

**答案是:**我们可以查看存储过程的详细,但是需要用另一种方法:

SHOW CREATE PROCEDURE 数据库.存储过程名;

MySQL存储过程的修改

ALTER PROCEDURE

更改用 CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。

MySQL存储过程的删除

删除一个存储过程比较简单,和删除表一样:

从 MySQL 的表格中删除一个或多个存储过程。

DROPPROCEDURE

MySQL存储过程的控制语句

(1). 变量作用域

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

mysql > DELIMITER // mysql > CREATE PROCEDURE proc3() -> begin -> declare x1 varchar(5) default 'outer'; -> begin -> declare x1 varchar(5) default 'inner'; -> select x1; -> end; -> select x1; -> end; -> // mysql > DELIMITER ;
(2). 条件语句

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 ; case when var=0 then insert into t values(30); when var>0 then when var<0 then else end case
(3). 循环语句

1. while ···· end while

mysql > 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 ;

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

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

相关文章

2025 AtomGit 最受欢迎 G-Star 项目 组织名单公示

本次评选活动面向全体 G-Star 认证个人项目、G-Star 认证开源组织。分个人和组织两个赛道&#xff0c;以项目/组织 2025 年末在 AtomGit 平台的各项社区化数据进行积分排名。共 332 个 G-Star 项目、152 个 G-Star 组织参与竞选&#xff0c;最终评选出得分最高的项目和组织共 1…

【深度收藏】前端+AI进阶指南:超越简单API调用的系统级开发思维

本文揭示了当前前端AI开发的现状与差距&#xff0c;指出多数项目仅停留在API包装的Demo阶段。真正的AI前端需掌握流式输出、模型状态管理、工具调用调度等核心能力&#xff0c;将AI产品视为状态驱动的系统UI&#xff0c;而非简单的聊天框。作者强调前端开发者需超越API调用思维…

LUT 调色预设 + HDR 环境贴图超全合集分享(影视 / CG / 三维渲染适用)

在三维动画、影视特效、建筑可视化和产品渲染等制作流程中&#xff0c;画面质感的核心往往来自两个方面&#xff1a;一是调色风格是否统一&#xff0c;二是环境光是否真实自然。本文整理并分享一套 LUT 调色预设 HDR 环境贴图超全合集&#xff0c;覆盖影视级调色与高质量环境光…

esp32s3-pwm介绍与stm32的不同原理

1.ESP32-S3 最多可同时生成 20 路独立 PWM 波形&#xff0c;由 LEDC 和 MCPWM 模块共同提供。LEDC 模块&#xff1a;8 个独立通道&#xff0c;对应 8 路 PWM 波形。MCPWM 模块&#xff1a;2 个单元各含 6 路输出&#xff0c;总计 12 路 PWM 波形。2.通道就是独立输出 PWM 波形的…

【only-office】-----only-office前端参数说明大全

页面渲染 参数说明 key&#xff1a;对应文档的一个标识&#xff0c;建议前端随机生成&#xff0c;防止重复 url&#xff1a;打开文档的地址&#xff0c;返回流数据 fileType&#xff1a;文档类型&#xff0c;例如&#xff1a;doc/docx title&#xff1a;文件名称&#xff0c;例…

Mysql中使用sql语句生成雪花算法Id

?? 简介&#xff1a;java系列技术分享(??持续更新中…??) ?? 初衷:一起学习、一起进步、坚持不懈 ?? 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正?? ?? 希望这篇文章对你有所帮助,欢迎点赞 ?? 收藏 留言 ?? ?? 更多文章请点击 [这里是图片002]…

Nacos实例缓存

由于远程调用用RestTemplate请求注册中心获取微服务地址列表用RestTemplate给对方服务的某个地址发送请求每次调用都要请求两次&#xff0c;会非常耗费性能所以第一次获取实例列表之后&#xff0c;缓存一下&#xff0c;就不用再获取了|而实例缓存要做的就是&#xff0c;和注册中…

MySQL下载安装及配置

1.官网下载https://dev.mysql.com/downloads/mysql/2.下载解压安装包3.把下载文件打开&#xff0c;进入到bin文件中&#xff0c;将文件路径复制到系统变量path中4. 在MySQLmysql-9.1.0-winx64文件夹的根目录下&#xff0c;新建一个my.ini文件&#xff0c;把下面内容复制到文件中…

标杆案例 | 长江产业集团数智化转型驱动国企人力资源管理新范式

当前&#xff0c;数字经济加速渗透各行各业&#xff0c;人力资源管理数字化已成为企业顺应技术变革、支撑战略落地的关键路径。作为扎根长江经济带、深耕产业升级的重要力量&#xff0c;长江产业集团将人力资源数字化建设纳入深化改革的重要举措&#xff0c;携手红海云以新一代…

进口标致专修全系车型维修手册诊断手册电路图资料库上线更新RCZ 206CC 206GTi 308CC 308SW 407 4008 607 207CC 3008 207SW 208 307CC 307

资料来源&#xff1a;汽修帮手资料库汽修帮手资料库提供各大厂家车型维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等&#xff0c;并长期保持高频率资料更新该车系资料…

mysql之如何获知版本

你可以通过在 MySQL 命令行客户端执行简单的 SQL 查询来获取 MySQL 的版本信息。以下是获取 MySQL 版本的常见方法&#xff1a; 使用 SELECT VERSION(); 查询&#xff1a; SELECT VERSION();执行这个查询后&#xff0c;MySQL 会返回一个字符串&#xff0c;其中包含了 MySQL 服务…

2025年比亚迪全系更新上线维修手册电路图钣金手册故障诊断支持超链接跳转宋L 海豹 汉EV 唐-新能源 驱逐舰05 海鸥 海豚 元PLUS 汉DM 宋PLUS

资料来源&#xff1a;汽修帮手资料库汽修帮手资料库提供各大厂家车型维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等&#xff0c;并长期保持高频率资料更新该车系资料…

JSON.parse() 方法详解

JSON.parse() 方法详解 概述 JSON.parse() 是 JavaScript 中用于将 JSON 字符串解析成 JavaScript 对象的内置方法。在处理 JSON 数据时,这是一个非常常用的方法。本文将详细解释 JSON.parse() 的用法、注意事项以及在实际应用中的示例。 语法 JSON.parse(text[, reviver]…

大数据领域 OLAP 的高可用性架构设计

大数据OLAP高可用性架构设计:从理论到落地的完整指南 引言:从一次凌晨宕机说起 凌晨3点,你被刺耳的告警声惊醒——业务方的实时Dashboard突然无法加载,核心指标“实时订单转化率”显示为空白。打开监控系统一看:ClickHouse集群的1号分片主节点宕机,而副本同步延迟高达5…

交通仿真软件:Aimsun_(19).交通仿真软件在规划中的应用

交通仿真软件在规划中的应用 1. 交通需求模型的建立 在交通规划中&#xff0c;交通需求模型是预测未来交通流量的重要工具。Aimsun 提供了强大的交通需求建模功能&#xff0c;可以帮助规划师准确预测各种交通情景下的需求。交通需求模型通常包括以下几个步骤&#xff1a;数据收…

长安睿行EM60 睿行EM8 0睿行ES30 睿行M60 睿行M70 睿行M80 睿行M90 睿行S50维修手册电路图针脚定义大修正时螺丝扭力拆装步骤线路保险丝图解模块位置更新

资料来源&#xff1a;汽修帮手资料库汽修帮手资料库提供各大厂家车型维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等&#xff0c;并长期保持高频率资料更新覆盖车型&a…

交通仿真软件:Aimsun_(13).网络优化与设计

网络优化与设计 1. 网络建模基础 在网络优化与设计中&#xff0c;网络建模是基础步骤之一。Aimsun 提供了丰富的工具和功能来帮助用户构建和优化交通网络模型。本节将详细介绍网络建模的基本原理和步骤&#xff0c;并通过具体示例来展示如何使用 Aimsun 进行网络建模。 1.1 网络…

深度学习毕设项目推荐-基于机器学习的印刷体数字和字母识别基于python深度学习的印刷体数字和字母识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

长安凯程神骐维修手册电路图资料更新神骐ET20 神骐F30 神骐PLUS 神骐T10 神骐T20 神骐T30拆装步骤螺丝扭力针脚定义保险丝图解发动机大修螺丝扭力正时校对

资料来源&#xff1a;汽修帮手资料库汽修帮手资料库提供各大厂家车型维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等&#xff0c;并长期保持高频率资料更新覆盖车型&a…

深度学习毕设项目推荐-基于人工智能python深度学习的猫狗表情识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…