大多数关系数据库(包括 MySQL、MariaDB 和 SQL Server)都支持存储过程和函数。实际上,存储过程和函数是非常相似的,可以用来完成相同的任务。话虽如此,在決定某项工作使用哪一种时,需要考虑两者之间的一些重要差异。我们将在今天的文章中逐一介绍这些差异。
存储过程
存储过程(stored procedure,简称 proc)是一组带有指定名称的结构化查询语言(Structured Query Language,SQL)语句,作为一个组存储在关系数据库管理系统中,因此可以被多个程序重用和共享。存储过程可以访问或修改数据库中的数据,但它不依赖于特定的数据库或对象。这种不紧密耦合的情况是有利的,因为为不同但相似的目的重用过程是很容易。
存储过程可以接受输入参数并返回多个输出参数值。此外,存储过程可以对语句进行编程以在数据库中执行操作,并将状态值返回给调用过程或批处理。
最后,存储过程可以运行多个 SQL 语句、调用函数,甚至迭代结果集、执行类似于编程代码的复杂操作。过程完成后,通常会将一个或多个结果集返回给调用应用程序。
用户函数
函数类似于存储过程,因为它包含一组执行特定任务的 SQL 语句。函数背后的意义是促进代码的可重用性。如果你要重复编写大型 SQL 脚本来执行相同的任务,则可以创建一个执行该任务的函数,以便下次执行该任务时不必重写 SQL,调用该函数就可以了。数据库通常包含一组执行各种任务的内置函数,因此在编写自己的函数之前,请务必先查看这些内置函数。
函数以参数的形式接受输入并返回值。与存储过程不同,函数不能返回结果集。而且,函数无法修改服务器环境或操作系统环境。
主要差异
虽然可以以类似的方式使用过程和函数,但是函数被设计为将其输出发送到查询或 SQL 语句。同时,存储过程被设计为将输出(即一个或多个结果集)返回给应用程序。
另一个差异是,你可以对一组 SQL 语句进行分组并在存储过程中运行它们,而存储过程不能在 SQL 语句中调用。但函数则可以直接从查询和/或存储过程中调用。
最后,函数的一个限制是必须为每一行数据调用它们。因此,如果你在大型数据集使用函数,则可能会遇到性能问题。
在 Navicat 查看存储过程和函数
在 Navicat 数据库管理和开发工具中,你可以在“函数”下看到过程和函数。存储过程具有“Px”图标,而函数具有“fx”图标:
总结
存储过程和函数在很多方面非常相似,但每种都有不同的用途。存储过程可以视为一组 SQL 语句,而函数则接受输入参数并根据输入的参数返回输出值。