接下来的两篇文章我们将会介绍MySQL存储过程和函数。本篇主要介绍它们的概念和管理,下一篇将会讨论如何编写存储过程和函数来实现业务需求。
31.1存储过程简介MySQL存储过程(Storedprocedure)是一种存储在数据库中的程序。它可以包含多个SQL语句,提供许多过程语言的功能,例如变量定义、条件语句、循环语句、游标以及异常处理等。存储过程没有返回值,但是它可以通过输出参数实现数据的返回,同时还可以产生一个查询结果返回到客户端。
在数据库中创建存储过程之后,应用程序或其他存储过程可以通过名称对其进行重复调用。
在介绍存储过程的管理之前,我们还需要了解一下它的优缺点,存储过程的主要优点包括:
实现代码的重用和集中管理。存储过程存储在数据库中,可以被重复调用,不同的应用可以共享存储过程;
实现业务的封装和隔离。应用程序通过接口访问存储过程;当业务发生变化时,只需要修改存储过程的逻辑,对应用程序毫无影响;
减少了应用与数据库之间的网络流量。调用存储过程时,只需要传递参数,在一定程度上可以减轻网络负担;
存储过程可以提高安全性。应用程序通过存储过程进行数据访问,而不需要直接访问数据表,保证数据的安全。
不过,存储过程也存在一些缺点:MySQL存储过程的语法和其他数据库之间不兼容,无法直接移植;
存储过程需要占用数据库服务器的资源,包括CPU、内存等。MySQL对于大量逻辑处理的支持不够完善;
存储过程的开发和维护需要专业的技能。MySQL存储过程不支持调试功能,增加了应用程序的开发和维护难度。
一般来说,对于业务快速变化的互联网应用,倾向于将业务逻辑放在应用层,便于扩展;对于传统行业,或者复杂的报表分析,合理使用存储过程可以提高效率。31.2创建存储过程MySQL使用CREATEPROCEDURE语句创建存储过程:
CREATEPROCEDUREsp_name([IN
OUT
INOUT]param_namedata_type,...)routine_body;
其中,sp_name是存储过程名称;param_name是参数名称,IN表示输入参数(默认模式),OUT表示输出参数,INOUT表示输入输出参数;data_type是参数的数据类型;routine_body是存储过程的具体实现。
下面是一个创建存储过程的示例:
DELIMITERCREATEPROCEDUREGetDevelopers()BEGINSELECTemp_name,sex,hire_date,salary,bonus,emailFROMemployeeWHEREdept_id=4;ENDDELIMITER;
其中,DELIMITER不属于存储过程的内容。由于很多MySQL客户端将分号(;)作为SQL语句的终止符,而存储过程中包含多个语句;为了将存储过程的定义整体发送到服务器,需要将终止符临时修改为其他符号(例如),最后再将其改回分号。BEGIN和END表示程序主体的开始和结束。
存储过程GetDevelopers没有参数,程序体中包含了一个查询语句,用于返回开发部门的员工信息。MySQL使用CALL语句调用存储过程,例如:
CALLGetDevelopers();emp_name
sex
hire_date
salary
bonus
--------
---
----------
--------
-----
-------------------
赵云
男
-12-19
.00
0.00
zhaoyun
shuguo.