确定何时使用 SQL 过程或 SQL 函数

SQL 过程语言 (SQL PL) 是 SQL 的语言扩展,由可用来在 SQL 语句中实现过程逻辑的语句和语言元素组成。可通过使用 SQL 过程或 SQL 函数来利用 SQL PL 实现逻辑。

过程

下列情况下选择实现 SQL 函数:
  • SQL 函数可满足功能需求,并且您预计以后不需要 SQL 过程提供的功能。

  • 优先考虑性能,并且要包含在例程中的逻辑仅由查询组成或者仅返回单个结果集。

    它们仅包含查询或返回单个结果集时,SQL 函数的性能比逻辑上等价的 SQL 过程(因为 SQL 函数的编译方式)。

    在 SQL 过程中,SELECT 语句和全查询语句格式的静态查询是分别编译的,这样每个查询都成为创建 SQL 过程时程序包中查询访问方案的一个部分。直到重新创建 SQL 过程或程序包重新绑定至数据库,才会重新编译此程序包。这意味着查询的性能根据执行 SQL 过程之前对数据库管理器可用的信息确定,因此可能并非最优。而且,对于 SQL 过程,数据库管理器在执行过程流语句与查询或修改数据的 SQL 语句之间转换时会有小小开销。

    但是,SQL 函数会在引用它们的 SQL 语句中扩展并编译,这意味着每次编译该 SQL 语句时(取决于该语句动态执行的情况)会编译这些函数。因为 SQL 函数未直接与程序包相关联,所以数据库管理器在执行过程流语句与查询或修改数据的 SQL 语句之间转换时没有开销。

下列情况下选择实现 SQL 过程:

  • 需要仅在 SQL 过程中受支持的 SQL PL 功能。这包括:输出参数支持、使用游标、将多个结果集返回给调用程序的能力、完整条件处理支持、事务和保存点控制及其他功能。
  • 您想要执行只能在 SQL 过程中执行的非 SQL PL 语句。
  • 您想要修改数据,并且您需要的函数类型不支持修改数据。

结果

尽管并不总是那么显而易见,但通常可轻松地将 SQL 过程重写为执行等价逻辑的 SQL 函数。如果您在意每一次小小的性能改进,那么这可能是使性能达到最佳的有效方式。