何时使用过程

使用过程有许多优点,这些优点都是基于使用过程将 SQL 语句从应用程序移动到数据源这一事实。 应用程序中剩下的是一个可互操作的过程调用。 优点包括:

  • 性能 - 过程通常是执行 SQL 语句的最快方法。 与准备好的执行一样,语句的编译和执行分为两个单独的步骤。 与准备好的执行不同,过程仅在运行时执行。 它们在不同的时间进行编译。

  • 业务规则 - 业务规则是关于公司开展业务之方式的规则。 例如,仅允许头衔为“销售人员”的人添加新的销售订单。 将这些规则放入过程中,各个公司可以通过重写应用程序调用的过程来自定义垂直应用程序,而无需修改应用程序代码。 例如,订单输入应用程序可能会使用固定数量的参数来调用过程 InsertOrder;确切地说,InsertOrder 的具体实现方式因公司而异。

  • 可替换性 - 与在过程中放置业务规则密切相关的是,可以在不重新编译应用程序的情况下替换过程。 如果在公司购买并安装了应用程序后,业务规则发生了变化,那么公司可以更改包含该规则的过程。 从应用程序的角度来看,什么都没有改变;它仍然调用特定的过程来完成特定的任务。

  • 特定于 DBMS 的 SQL - 过程为应用程序提供了一种方法,可以利用特定于 DBMS 的 SQL,同时仍然保持互操作。 例如,在 SQL 中支持流控制语句的 DBMS 上的过程可能会捕获错误并从错误中恢复,而在不支持流控制语句的 DBMS 上的过程可能只会返回一个错误。

  • 过程在事务中存活 - 在某些数据源上,当提交或回滚事务时,将删除连接上所有已准备好语句的访问计划。 通过将 SQL 语句放在过程中(过程永久存储在数据源中),语句可以在事务中存活。 过程是在已准备好、部分准备好或是未准备好状态中存活,取决于 DBMS。

  • 独立开发 - 过程可以独立于应用程序的其余部分单独开发。 在大型企业中,这可能会提供一种进一步利用高度专业化的程序员技能的方法。 换句话说,应用程序的程序员可以编写用户界面代码,数据库的程序员可以编写过程。

过程通常由垂直应用程序和自定义应用程序使用。 这些应用程序倾向于执行固定任务,并且可以对这些任务进行硬编码过程调用。 例如,订单输入应用程序可能会调用 InsertOrder、DeleteOrder、UpdateOrder 和 GetOrders 过程。

几乎没有理由从泛型应用程序调用过程。 过程通常是为了在特定应用程序的上下文中执行任务而编写的,因此对泛型应用程序没有用处。 例如,电子表格没有理由调用刚才提到的 InsertOrder 过程。 此外,泛型应用程序不应在运行时构造过程,以期提供更快的语句执行;这不仅可能会比准备或直接执行慢,而且还需要特定于 DBMS 的 SQL 语句。

应用程序开发环境是一个例外,它通常会为程序员提供一种方法来构建执行过程的 SQL 语句,并可能为程序员提供一种方法来测试过程。 此类环境会调用 SQLProcedures 来列出可用的过程,调用 SQLProcedureColumns 来列出输入、输入/输出和输出参数、过程返回值以及过程创建的任何结果集的列。 但是,必须事先对每一个数据源开发此类过程;这样做需要特定于 DBMS 的 SQL 语句。

使用过程有三个主要缺点。 首先,必须为要运行应用程序的每个 DBMS 编写和编译过程。 虽然这对于自定义应用程序不是问题,但对于设计为使用大量 DBMS 运行的垂直应用程序来说,它可能会显著增加开发和维护时间。

其次,许多 DBMS 不支持过程。 同样,对于设计为使用大量 DBMS 运行的垂直应用程序来说,这很可能是一个问题。 若要确定是否支持过程,应用程序可以使用 SQL_PROCEDURES 选项来调用 SQLGetInfo

再次,ODBC 没有定义用于创建过程的标准语法,这一点特别适用于应用程序开发环境。 也就是说,尽管应用程序可以使用互操作方式调用过程,但它们无法使用互操作方式创建过程。