MySQL 存储过程是一组预编译的 SQL 语句,它们被组合在一起并命名为一个单元。存储过程可以在 MySQL 数据库中创建和存储,并可以在需要时被调用执行。
简单来说,就是为以后方便使用而保存的一条或多条 MySQL 语句,并且给它取了一个名字,需要用的时候直接调用,不要每次都重复编写这些 SQL 语句。
(1)简化复杂操作:通过把处理封装在容易使用的单元中,简化了应用程序的复杂操作;
(2)简化对变动的管理:如果表名、列名或业务逻辑有变化。只需要更改存储过程的代码,使用它的人员不会改自己的代码;
(3)有助于提高性能:当创建的存储过程被编译之后,就存储在数据库中。但是,MySQL 实现的存储过程略有不同。MySQL 存储过程按需编译。在编译存储过程之后,MySQL 将其放入缓存中。MySQL 为每个连接维护自己的存储过程高速缓存。如果应用程序在单个连接中多次使用存储过程,则使用编译版本,否则存储过程的工作方式类似于查询。
(4)减少应用程序与数据库的通信:存储过程有助于减少应用程序和数据库服务器之间的流量和通信,因为应用程序不必发送多个冗长的 SQL 语句,而只用发送存储过程的名称和参数;
(5)可重用:存储的程序对任何应用程序都是可重用的和透明的。存储过程将数据库接口暴露给所有应用程序,以便开发人员不必开发存储过程中已支持的功能;
(6)更安全:数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向基础数据库表提供任何权限。
(1)增大内存/CPU消耗:如果使用大量存储过程,那么使用这些存储过程的每个连接的内存使用量将会大大增加。此外,如果您在存储过程中过度使用大量逻辑操作,则 CPU 使用率也会增加,因为 MySQL 数据库最初的设计侧重于高效的查询,不利于逻辑运算;
(2)开发复杂业务困难:存储过程的构造使得开发具有复杂业务逻辑的存储过程变得更加困难;
(3)不支持调试:目前只有少数数据库管理系统允许调试存储过程。不幸的是,MySQL 不提供调试存储过程的功能;
(4)开发和维护存储过程并不容易:开发和维护存储过程通常需要一个非常熟悉存储过程开发的人员,并不是所有应用程序开发人员都熟悉存储过程开发,这可能会导致应用程序开发和维护阶段的问题。
下面通过一个简单的存储过程(该存储过程将输出 “hello world” 字符串)介绍如何创建存储过程,后续章节介绍存储过程创建的详细语法。
第一步:修改分隔符,用 delimiter 命令将 MySQL 控制台默认的 “;” 分隔符修改为其他字符,这样就允许我们在存储过程中通过 “;” 符号对语句进行结束。例如:
-- 这里设置命令结束分隔符为 $ 字符 mysql> delimiter $ -- 获取当前时间,默认应该写成 select now();,现在需要将 ; 替换成 & 字符 mysql> select now()$ +---------------------+ | now() | +---------------------+ | 2023-09-28 09:47:01 | +---------------------+ 1 row in set (0.03 sec)
第二步:编写存储过程,如下:
mysql> create procedure hello() -> begin -> select 'hello world'; -> end -> $ Query OK, 0 rows affected (0.01 sec)
注意:推荐在创建存储过程完成后将分隔符修改会默认值 “;”。
第三步:调用存储过程,使用 call 语句调用上面创建的存储过程,如下:
mysql> call hello()$ +-------------+ | hello world | +-------------+ | hello world | +-------------+ 1 row in set (0.03 sec) Query OK, 0 rows affected (0.00 sec)