何时使用过程

使用过程有很多优点,这一切都基于使用过程将 SQL 语句从应用程序移动到数据源。 应用程序中剩余的内容是可互作的过程调用。 这些优点包括:

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

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

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

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

  • 过程在事务后仍然有效 对于某些数据源,当事务提交或回滚时,连接上所有已准备语句的访问计划会被删除。 通过将 SQL 语句置于永久存储在数据源中的过程内,这些语句能够在事务结束后继续存在。 过程是否能在已准备、部分准备或未准备的状态中运行,取决于特定的 DBMS。

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

过程通常由垂直和自定义应用程序使用。 这些应用程序倾向于执行固定任务,可以对其中的调用进行硬编码处理。 例如,订单输入应用程序可能会调用 InsertOrderDeleteOrder、UpdateOrderGetOrders 的过程

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

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

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

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

第三个缺点特别适用于应用程序开发环境,即 ODBC 不定义用于创建过程的标准语法。 也就是说,尽管应用程序可以互操作地调用过程,但它们无法互操作地创建过程。