『MySQL』使用存储过程
存储过程
需要MySQL 5:MySQL 5添加了对存储过程的支持。
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。
可将其视为批文件,虽然他们的作用不仅限于批处理。
为什么要使用存储过程
为什么要使用他们呢?下面是一些主要的理由:
通过把处理封装在容易使用的单元中,简化复杂的操作。
由于不要求反复建立一系列处理步骤,这保证了数据的完整性。
如果所有开发人员和应用程序都使用同一(实验和测试)存储过程,则所使用的代码是相同的。
这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能越大。防止错误保证了数据的一致性。
简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。
这一点的延伸就是安全性。通过存储过程限制对基础数据的访问减少了数据讹误(无意识的或别的原因所导致的数据讹误)的机会。
提高性能。因为使用存储过程比使用单独的SQL语句要快。
存在一些只能用在单个请求中的MySQL元素和特性,存储过程可以使用他们来编写功能更强更灵活的代码(下一章的例子中可以看到)。
使用存储过程有3个主要的好处,即简单、安全、高效性。
不过,在将SQL代码转换为存储过程前,也必须知道她的一些缺陷:
一般来说,存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。
你可能没有创建存储过程的安全访问权限。
许多数据库管理员限制存储过程的创建权限,允许用户使用存储过程,但不允许他们创建存储过程。
尽管有这些缺陷,存储过程还是非常有用的,并且应该尽可能的使用。
不能编写存储过程?你依然可以使用:MySQL将编写存储过程的安全和访问与执行存储过程的安全和访问区分开来。
即使不能(或不想)编写自己的存储过程,也仍然可以在适当的时候执行别的存储过程。
使用存储过程
执行存储过程
MySQL称存储过程的执行为调用,因此MySQL执行存储过程的语句为
CALL
。CALL
接受存储过程的名字以及需要传递给它的任意参数。
1 | -- 执行名为productpricing的存储过程,计算并返回产品的最低、最高和平均价格 |
创建存储过程
1 | -- 创建返回产品平均价格的存储过程 |
mysql命令行客户机的分隔符:如果使用的是mysql命令行实用程序,应该仔细阅读以下:
默认的MySQL语句分隔符为
;
。mysql命令行实用程序也使用;
作为语句分隔符。如果命令行实用程序要解释存储过程自身内的
;
字符,则他们最终不会成为存储过程的成分,这会使存储过程中的SQL出现句法错误。解决办法是临时更改命令行使用程序的语句分隔符,如下所示:
1 | DELIMITER // |
删除存储过程
- 存储过程在创建之后,被保存在服务器上以供使用,直至被删除。
1 | -- 删除上边创建的存储过程,注意没有使用(),只给出存储过程名 |
仅当存在时删除:如果指定的过程不存在,则
DROP PROCEDURE
将产生一个错误。当过程存在想删除它时(如果过程不存在也不产生错误)可使用
DROP PROCEDURE IF EXISTS
。
使用参数
一般存储过程不显示结果,而是把结果返回给你指定的变量。
以下是productpricing的修改版本(如果不先删除此存储过程,则不能再次创建它):
1 | CREATE PROCEDURE productpricing( |
- MySQL支持
IN
(传递给存储过程)、OUT
(从存储过程传出)和INOUT
(对存储过程传入和传出)类型的参数。 - 参数的数据类型:记录集不是允许的类型,因此,不能通过一个参数返回多个行和列。
- 变量名:所有MySQL变量都必须以
@
开始。
1 | -- 为调用此修改过的存储过程,必须指定3个变量名 |
建立智能存储过程
- 只有在存储过程内包含业务规则和智能处理时,他们的威力才真正显现出来。
1 | /* |
检查存储过程
1 | -- 显示用来创建一个存储过程的CREATE语句 |
- 限制过程状态结果:
SHOW PROCEDURE STATUS
列出所有存储过程。
1 | -- 为限制其输出,可使用LIKE指定一个过滤模式 |