第 11 章 使用存储例程、触发器和计划事件 使用存储例程、触发器和计划事件
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
11.0 引言
在本书中,术语 "存储程序"是指存储例程、触发器和事件的统称,而 "存储例程"是指存储函数和存储过程的统称。
本章讨论的是存储程序,有多种类型:
- 存储函数和程序
存储函数或存储过程对象封装了用于执行操作的代码 ,使您可以通过名称轻松调用对象,而不必在每次需要时重复所有代码。存储函数执行计算并返回一个值,该值可以在表达式中使用,就像内置函数(如
RAND()、NOW()或LEFT())一样。存储过程执行不需要返回值的操作。存储过程通过CALL语句调用,而不是在表达式中使用。存储过程可能会更新表中的行,或者产生一个结果集发送给客户端程序。- 触发器
触发器是当表被
INSERT、UPDATE或DELETE语句修改时激活的对象。例如,可以在值插入表之前对其进行检查,或者指定从表中删除的任何行都应记录到另一个表中,作为数据更改日志。触发器可以自动执行这些操作。- 预定活动
事件是在预定的 时间或时间执行 SQL 语句的对象。将预定事件想象成在 MySQL 中运行的 Unix
cron作业。例如,事件可以帮助你执行管理任务,如定期删除旧表行或创建夜间摘要。
存储程序是用户定义的数据库对象,但存储在 服务器端,供以后执行。这与从客户端向服务器发送 SQL 语句以便立即执行不同。每个对象也都有其属性,在该属性中定义了调用该对象时要执行的其他 SQL 语句。对象主体是一条 SQL 语句,但该语句可以使用包含多条语句的复合语句语法(一个BEGIN...END 块)。因此,主体的范围可以从非常简单到极其复杂。下面的存储过程是一个琐碎的例程,除了显示当前的 MySQL 版本外什么也不做,使用的主体由单条SELECT 语句组成:
CREATEPROCEDUREshow_version()SELECTVERSION()AS'MySQL Version';
更复杂的操作使用BEGIN...END 复合语句:
CREATEPROCEDUREshow_part_of_day()BEGINDECLAREcur_time,day_partTEXT;SETcur_time=CURTIME();IFcur_time<'12:00:00'THENSETday_part='morning';ELSEIFcur_time='12:00:00'THENSETday_part='noon';ELSESETday_part='afternoon or night';ENDIF;SELECTcur_time,day_part;END;
在这里,BEGIN...END 块包含多条语句,但其本身被视为构成一条语句。通过复合语句,您可以声明局部变量,使用条件逻辑和循环结构。与在非复合语句(如SELECT 或UPDATE )中编写内联表达式相比,这些功能为算法表达提供了更大的灵活性。
复合语句中的每条语句必须以 ; 字符结束。如果使用mysql 客户端定义使用复合语句的对象,这一要求就会造成问题,因为mysql 本身是通过解释; 来确定语句边界的。解决办法是在定义复合语句对象时重新定义mysql的语句分隔符。语法 11.1介绍了如何做到这一点;在继续后面的语法之前,请务必阅读该语法。
本章通过示例说明了存储例程、触发器和事件,但由于篇幅有限,不再详细介绍它们的大量语法。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access