MySQL 存储程序详解
一、什么是存储程序
存储程序是指将一组预编译的SQL语句和逻辑控制结构存储在数据库服务器中,用户可以通过简单的调用命令来执行这些预定义的任务。这种方式不仅提高了代码的重用性和安全性,还能显著提升执行效率。
二、存储程序分类
MySQL中的存储程序主要分为以下四类:
- 存储过程
存储过程是一组为了完成特定功能而封装在一起的SQL语句集合。它允许开发者将复杂的业务逻辑封装起来,提供给应用程序调用。
优点: 提高代码复用性,增强安全性;
缺点: 高度依赖于特定的数据库系统,迁移成本较高。
创建:
CREATE PROCEDURE procedure_name ( [parameter1 datatype, parameter2 datatype, ...] ) BEGIN statement; END;
调用:
CALL procedure_name (value1, value2, ...);
删除:
DROP PROCEDURE [IF EXISTS] procedure_name;
查看:
SHOW PROCEDURE STATUS;
SHOW CREATE PROCEDURE procedure_name;
- 存储函数
存储函数类似于自定义函数,可以在SQL查询中直接调用,返回单个值或表对象。
创建:
CREATE FUNCTION function_name ( [parameter1 datatype, ...] ) RETURNS return_type BEGIN statement; RETURN value; END;
删除:
DROP FUNCTION [IF EXISTS] function_name;
调用:
SELECT function_name (value1, ...);
- 触发器
触发器是在特定数据操作(如插入、更新或删除)发生时自动执行的一组SQL语句。它们常用于实施复杂的业务规则或维护数据完整性。
创建:
CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW BEGIN statement; END;
查看:
SHOW TRIGGERS [FROM database_name];
删除:
DROP TRIGGER trigger_name;
- 事件
事件是基于时间调度的存储程序,可以在指定的时间点或周期性地执行特定任务,适用于定期维护工作或自动化任务。
创建:
CREATE EVENT event_name ON SCHEDULE schedule DO BEGIN statement; END;
删除:
DROP EVENT [IF EXISTS] event_name;
三、存储过程与存储函数的区别
存储过程和存储函数虽然都是存储程序的一部分,但它们在功能和使用上存在明显差异:
存储过程 | 存储函数 |
---|
功能较为复杂,适合处理多种数据库操作 | 功能相对单一,专注于特定任务 |
可以直接修改数据库状态,如更新表数据 | 不允许修改数据库状态,主要用于计算和返回结果 |
可以返回多个输出参数,包括记录集 | 只能返回一个值或表对象 |
支持IN、OUT、INOUT三种参数类型 | 仅支持IN参数类型 |
声明时无需指定返回类型 | 声明时需指定返回类型,并包含RETURN语句 |
可以使用非确定性函数 | 禁止使用非确定性函数 |
作为独立单元执行,通过CALL调用 | 作为SQL查询的一部分,通过SELECT调用 |
不能直接在SQL语句中使用 | 可以作为表对象出现在FROM子句中 |
补充说明:
确定性函数是指其返回值完全由输入参数决定,不受外部环境影响。例如,SUM()函数对一组固定的数值求和,无论何时调用,只要输入相同,结果不变。而非确定性函数,如NOW()获取当前时间,每次调用可能返回不同的值。