存储过程和函数
数据库通常包含可重用的代码块,用于执行操作、计算或业务逻辑。这些代码块被封装在存储过程和函数中,从而提高了模块化、可维护性和性能。1. 存储过程
定义:
存储过程是一组预编译的 SQL 语句,存储在数据库中,可以执行查询、插入、更新或删除数据等任务。存储过程可以接受参数、执行复杂的逻辑并返回结果。
主要特性:
可以接受输入、输出或输入/输出参数。
可以返回多个结果集,但不能像函数那样返回单个值。
可以包含控制流语句(IF、WHILE、CASE)。
使用 CALL 或 EXEC 命令显式执行。
示例:MySQL 中的存储过程
DELIMITER //
CREATE PROCEDURE GetEmployeeByDept(IN deptId INT)
BEGIN
SELECT EmployeeID, Name, Salary
FROM Employee
WHERE DepartmentID = deptId;
END;
// DELIMITER ;
-- 调用存储过程
CALL GetEmployeeByDept(5);
此存储过程检索指定部门的所有员工。
2. 函数
定义:
函数是数据库对象,它执行计算或操作并返回单个值。函数通常用于查询、表达式或其他存储过程中。
主要特性:
始终返回一个值。
可用于 SELECT 语句、WHERE 子句或表达式。
通常不能执行修改数据的操作(取决于数据库类型)。
通常比存储过程更能限制副作用。
示例:MySQL 中的函数
DELIMITER //
CREATE FUNCTION CalculateBonus(salary DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
RETURN salary * 0.10;
END;
// DELIMITER ;
-- 在查询中使用该函数
SELECT Name, Salary, CalculateBonus(Salary) AS Bonus
FROM Employee;
此函数计算每位员工 10% 的奖金。
存储过程与函数的区别
特性 存储过程 函数
返回值 可以返回多个结果集或不返回任何结果集 必须返回单个值
用法 通过 CALL 或 EXEC 执行 可用于 SQL 表达式
副作用 可以修改数据库对象和数据 通常不能修改数据
参数 输入、输出或输入/输出 仅限输入参数
用途 复杂任务、批量操作 计算、可重用表达式
优势
代码重用性:一次编写,多次重用。
模块化:将复杂操作分解成更小的单元。
性能:预编译代码的执行速度比即席查询更快。
安全性:限制对表的直接访问;用户可以通过过程/函数进行交互。
可维护性:更容易在一个地方更新逻辑,而无需更改多个应用程序。
最佳实践
使用有意义的名称
例如:GetEmployeeByDept、CalculateBonus。
限制函数中的副作用
函数应专注于计算;尽可能避免修改表。
记录参数和返回值
帮助其他开发人员理解用法和用途。
优雅地处理错误
使用 TRY/CATCH 或数据库特定的错误处理机制。
保持过程和函数的模块化
避免使用单体式过程;将复杂的任务拆分成更小的可重用组件。
用例
存储过程:
批量数据更新或插入
实现业 兄弟手机清单 务逻辑(例如,订单处理)
自动化管理任务(备份、数据清理)
函数:
计算派生值(奖金、税金、折扣)
格式化数据(根据名字和姓氏生成全名)
将重复计算封装在查询中
简而言之,存储过程用于任务和操作,而函数用于计算和可重用值。它们共同使数据库更强大、更易于维护和更高效。
頁:
[1]