MySQL:存储过程

禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!

存储过程#

实际操作中会出现,对于一些操作需要多条语句的配合才能完成。这里可以用编程中的顺序结构来类比,当我每次需要完成这个操作都需要把完整的 SQL 语句写一遍,这么写不仅麻烦,还容易出错。我们在编程中是怎么优化这个问题的?就是将固定操作的代码块封装成一个函数,然后通过参数的传递实现函数调用。所谓存储过程就与编程中的函数有类似之处,是一条或多条 MySQL 语句的集合,也可以当作是批处理文件。存储过程的语句编写会稍微复杂一些,同时也会有权限问题,但是存储过程的优势还是很明显的,在于简捷、安全、性能好 3 个方面:

  1. 封装一段代码,使得操作变得简捷;
  2. 规避了反复建立某种操作容易出错的问题,保证了数据的完整性;
  3. 操作的健壮性、移植性增强,修改功能可以通过修改存储过程实现;
  4. 存储过程的执行速度比 SQL 语句更快,使得效率提高;
  5. 存储过程可以实现的功能更为灵活。

存储过程基操#

创建#

定义存储过程要使用 CREATE PROCEDURE 定义,在语句后面要给出存储过程名,若可以接受参数就需要在括号内罗列出来。语法框架为:

Copy Highlighter-hljs
CREATE PROCEDURE name(variable1,variable2……) BEGIN --MySQL 语句 END

创建存储过程时需要指定哪些变量需要输入和输出,用 OUT 关键字指定,输入用 IN 关键字指定,若同时需要输入和输出,用 INOUT 关键字指定。

  • 为了便于在命令提示符中调试,可以用以下代码修改语句的结束符。
Copy Highlighter-hljs
DELIMITER //

执行#

执行存储过程的语句为 CALL name(),如果需要传参就要在括号之间填充参数。

删除#

存储过程将在服务器上供调用,我们可以把建立的存储过程删掉,使用 DROP PROCEDURE 删除语句实现。

若指定的存储过程不存在会报错,可以使用下列语句实现异常处理。

Copy Highlighter-hljs
DROP PROCEDURE IF EXISTS

使用参数#

在这里给出 3 个参数,这些参数是此存储过程所接受的,每个参数必须指定数据类型,例如下面就使用了十进制数字。OUT 就说明这些参数是需要返回给调用者的,操作完值之后就使用 INTO 将值注入变量之中。而对于存储过程的运行的代码就封装在 BEGIN 和 END 语句之内。

此时用 CALL 语句调用存储过程后,返回的变量将会被调出来。MySQL 中的变量都是以 @开始的,由于存储过程有 3 个参数,因此也必须传 3 个参数。

这个时候就使用 SELECT 语句依次查看变量。

  • 存储过程中的参数的数据类型和表中对应数据的数据类型应当是相同的。同时数据集是不被认可的数据类型,因此不能够使用一个参数集成多个行和列。

传入参数#

创建时需要用关键字 IN 指定传入的参数。

传参就要按照参数表填写变量,这个顺序不能有错。

实例#

IF 语句#

在存储过程中引入分支处理的代码框架为:

Copy Highlighter-hljs
IF expression1 THEN --MySQL 语句段 ELSEIF expression2 THEN --MySQL 语句段 ELSE --MySQL 语句段 END IF;

结合选择结构#


这个实例实现的功能就更强了,那么这里解释一下选择结构的功能。IF 语句检查变量是都是真,真的情况下用一个 SELECT 语句将值注入变量中,若为假则用另一个 SELECT 语句将值注入变量。

  • COMMENT关键字用于给存储过程包含一个值,这个值会在检查语句时被回显。

现在传入 2 组参数进去试试看。

检查存储过程#

使用以下语句可以检查创建存储过程的语句。

Copy Highlighter-hljs
SHOW CREATE PROCUDURE name;


以下语句可以查看存储过程的创建信息。

Copy Highlighter-hljs
SHOW PROCUDURE STATUS LIKE name;

参考资料#

《MySQL Crash Course》[英] Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社

posted @   乌漆WhiteMoon  阅读(148)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-04-25 Wireshark实验——DNS 域名系统
点击右上角即可分享
微信分享提示
CONTENTS