确定何时使用 SQL 例程或动态预编译复合 SQL 语句
确定如何实现在使用 SQL 例程或动态预编译复合 SQL 语句之间进行选择时可能面对的 SQL PL 原子块和其他 SQL 语句。
尽管 SQL 例程在内部使用复合 SQL 语句,但选择使用哪一项可能取决于其他因素。
性能
如果动态预编译复合 SQL 语句的功能可满足您的需要,那么最好使用动态预编译复合 SQL 语句,原因是动态预编译复合 SQL 语句中出现的 SQL 语句作为单个块编译和执行。而且,这些语句的性能比逻辑上等价的 SQL 过程的 CALL 语句更好。
创建 SQL 过程时,会编译该过程并且创建包。该包会包含从 SQL 过程编译时起用于访问数据的最佳执行路径。动态预编译复合 SQL 语句在执行时编译。对于这些语句而言,用于访问数据的最佳执行路径通过使用最新数据库信息确定,这可能意味着它们的访问方案可能比之前创建的逻辑上等价的 SQL 过程更好,从而使得它们的性能更好。
必需逻辑的复杂度
如果逻辑非常简单并且 SQL 语句相对较少,那么应考虑在动态预编译复合 SQL 语句(指定 ATOMIC)或 SQL 函数中使用 SQL PL。SQL 过程也可处理简单逻辑,但使用 SQL 过程会导致一些开销,如创建并调用该过程,如非必要,应尽量避免这些开销。
要执行的 SQL 语句数
如果只有一个或两个 SQL 语句要执行,那么使用 SQL 过程可能没什么优点。实际上可能对执行这些语句所需的总体性能有负面影响。在此情况下,最好在动态预编译复合 SQL 语句中使用内联 SQL PL。
原子性和事务控制
原子性是另一个要考虑的事项。复合 SQL(内联型)语句必须为原子语句。不支持在复合 SQL(内联型)语句中进行落实和回滚。如果需要事务控制或对回滚至保存点的支持,那么必须使用 SQL 过程。
安全
安全性也可能成为要考虑的事项。SQL 过程只能由对过程具有 EXECUTE 特权的用户执行。如果需要限制可执行特定逻辑块的用户,那么这一点非常有用。还可管理执行动态预编译复合 SQL 语句的能力。但是,SQL 过程执行权限产生了额外的安全性控制层。
功能支持
如果需要返回一个或多个结果集,那么必须使用 SQL 过程。
模块性、寿命和重复使用
SQL 过程是永久存储在数据库中并且可由多个应用程序或脚本以一致方式引用的数据库对象。动态预编译复合 SQL 语句未存储在数据库中,因此无法稳定地重复使用它们包含的逻辑。
如果 SQL 过程能够满足您的需要,请使用 SQL 过程。一般来说,实现复杂逻辑或使用 SQL 过程支持但对动态预编译复合 SQL 语句不可用的功能时应选择使用 SQL 过程。