数据库存储过程的创建与使用

分类: 数据库

保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/68/ )。

存储过程(Stored Procedure)是数据库中的一段可以被重用的代码片段,可以通过外部调用完成较为复杂的操作。在调用时,可以为存储过程传入输入参数,而存储过程执行结束后也可以给出输出参数。

主流的数据库都支持存储过程,MySQL也不例外。接下来我们以MySQL为例介绍存储过程的创建、使用。

存储过程的创建过程并不复杂,创建语句格式如下所示:

CREATE PROCEDURE 存储过程名称
([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]])
过程体

其中存储过程的参数分为三类:

  • IN:输入参数,该参数向存储过程输入值,但是不能从存储过程中返回值。
  • OUT: 输出参数,该参数可以从存储过程中返回值,但是不能向存储过程输入值。
  • INOUT: 双向参数,该参数可以向存储过程输入值,也可以从存储过程中返回值。

在过程体中我们可以定义具体的操作,包括自定义变量、读取参数的值、设置参数的值、执行增删改查操作、进行逻辑判断等。

存储过程创建之后,我们便可以进行存储过程的查询、调用、删除等工作。其中调用存储过程的语句格式如下所示:

CALL 存储过程名称 ([参数 [,参数…]])

下面我们通过一个示例来展示下存储过程的使用。首先,我们使用命令行创建一个名为yeecode的存储过程,如下所示。

存储过程的创建

其中DELIMITER是一个单独的命令,与存储过程无关。通常,“;”是一条SQL语句的结束符,MySQL在遇到该符号时认为用户语句输入完毕。然而,在存储过程的创建中我们往往要输入多条语句,为了防止MySQL遇到第一个“;”便终止用户输入,因此需要先行将结束符修改为其他字符。DELIMITER命令就是修改结束符的命令。在上述示例中,我们先将结束符修改为“$$”,然后输入了包含“;”的语句,之后使用“$$”结束了我们的输入。最后,我们又使用DELIMITER命令将结束符修改回了“;”。

这样,我们便创建了一个存储过程。该存储过程有两个输入参数,分别为ageMinLimit、ageMaxLimit;有两个输出参数,分别为count、maxAge。概存储过程的功能是找出年龄在ageMinLimit、ageMaxLimit区间内的用户数目和区间内的最大年龄,然后分别放入输出参数count和maxAge返回。

创建完成后,我们可以调用我们创建的yeecode存储过程,如下所示。

存储过程的调用

上述示例中,我们输入了年龄的下界10、上界30后调用了存储过程,然后通过输出参数得出了该区间内的人数和最大年龄。

当然,使用结束后我们可以调用下图所示的语句删除存储过程。

存储过程的删除

相比于普通的SQL语句,存储过程支持变量定义、逻辑判断、数据校验、多输出等,功能更为强大。并且基于存储过程还可以将操作逻辑封装到数据库中,提高了逻辑的保密性。但是操作逻辑封装到数据库中也带来了逻辑不清晰、与数据库耦合高等问题。在使用中,要根据具体使用场景判断是否使用存储过程。

以上内容均参考《通用源码阅读指导书——MyBatis源码详解》一书。

通用源码阅读指导书-京东自营

《通用源码阅读指导书》

这是一本以MyBatis的源码为实例讲述源码阅读方法的书籍,并且附带有示例项目源码,MyBatis的全中文注解。书籍还总结了大量的编程知识和架构经验,对提升编程和架构能力十分有用。

而且,调用一次存储过程可能会得到多组结果。MyBatis也支持这个过程。MyBatis能够为存储过程准备参数,并解析存储过程返回的多组结果集,甚至可以对多组结果集进行组装。想了解相关内容,可以参考《通用源码阅读指导书——MyBatis源码详解》的“第22章 executor包”章节。

可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。

作者书籍推荐

作者书籍推荐 作者书籍推荐