本文中的技巧和技术有助于加速 pro*c 的迁移。文中的所有内容都基于一些实时迁移项目。
嵌入式 sql 是执行嵌入在宿主语言应用程序中的 sql 语句的一种方式。嵌入式 sql 应用程序首先连接到,然后执行这些嵌入式 sql。这些 sql 可以动态执行,也可以静态执行。最常用的宿主语言是 c 和 c++。在可以编译应用程序之前,构建嵌入式 sql 应用程序涉及两个主要步骤:prep(或 precompile)和 bind。
命令 prep 用于读取源代码、解析嵌入式 sql 并将它转换成 db2 运行时服务 api 调用,然后将输出写入一个新的源文件中。bind 用于将应用程序中的 sql 语句绑定到目标数据库。默认情况下,绑定操作是 precompile 步骤自身完成的,但也可以将它扩展为单独的一个步骤。
完成绑定后,就生成了针对 sql 语句的访问计划,并将这些计划存储在目标数据库内的一个包中。完成 precompile 和 bind 步骤之后,就可利用特定于宿主语言的开发工具对应用程序进行编译和链接。稍后我们会讨论获得嵌入式 sql 支持的这些步骤的语法。32 位和 64 位的嵌入式 sql 应用程序都可以利用嵌入式 sql 源代码进行开发。在 oracle 数据库中,基于 c/c++ 的嵌入式 sql数据库应用程序支持是 pro*c/c++;在 db2 luw 中,则为嵌入式 sql c/c++。
在本文当中,我们将了解嵌入式 sql c/c++ 和 pro*c/c++ 之间的主要差别,但我们会重点介绍将基于 pro*c/c++ 的应用程序从 oracle 迁移到 db2 luw 的一些技巧和技术。请参阅最新的 db2 luw 文档,了解目前受支持的特性。
db2 上的 oracle 兼容性支持
通常,将应用程序从一个 rdbms 迁移到另一个 rdbms 非常困难。但是,自 db2 luw 9.7 fixpack 5 版本起,增加了一些新的 sql 和 pl/sql 功能,这些功能提高了从 oracle 数据库迁移到 db2 的速度。在最新的 db2 luw(db2 luw 10.1)版本中,这些功能得到了进一步的增强。
对这些功能的支持是原生支持。db2 为数据类型、标量函数、包、语言元素、内置包和 pl/sql 过程语言提供了原生支持。通过本地支持,在 db2 引擎中,能够采用与其他 db2 原生语言元素相同的完整性和效能级别提供对这些功能的支持。这样,就可以利用 db2 提供的原有速度和效率来执行它们。oracle 的兼容特性消除了转换大多数 oracle 数据库对象(包括 pl/sql)的需求,并使得将为 oracle 编写的应用程序迁移到 db2 的任务变得更轻松。
要启用一个或多个 db2 兼容特性,则需要使用 db2_compatibility_vector 注册表变量。该变量是一个十六进制值,该变量中的每个位代表一个 db2 兼容特性。利用这个向量,可以选择启用特定功能(通过设置 db2_compatibility_vector 的特定位),也可以启用所有特性,将这个注册表变量设置为 ora。可以通过 db2set 设置此变量,建议在创建数据库之前设置该变量,并在数据库生命周期期间持续保持所选的兼容水平。关于该变量的详细讨论超出了本文的讨论范围。
pro*c/c++ 支持
如上所述,db2 luw 提供了许多兼容特性,这些特性有助于将基于 pro*c/c++ 的应用程序从 oracle 迁移到 db2 中的嵌入式 sql c/c++。通过将 precompile 的选项 compatibility_mode 设置为 ora,可以启用这些兼容特性。例如,对于名为 myapp1.sqc 的文件,可以通过运行 db2 precompile myapp1.sqc bindfile compatibility_mode ora 命令来启用兼容特性。
oracle pro*c/c++ 和嵌入式 sql c/c++ 的主要区别
让我们来查看一下 oracle pro*c/c++ 和嵌入式 sql c/c++ 之间的一些主要差别:
db2 中的静态包支持:在 db2 luw 中,可以采用两种方式执行 sql 语句:静态和动态。对于静态执行,需要在 precompile(预编译)时了解语句语法(必须在 precompile 时了解 sql 语句中引用的列名称和表)。precompile 为 sql 语句生成访问计划,并将其存储在数据库中定义的包中。oracle pro*c/c++ 语句无法静态执行上述语句。oracle pro*c/c++ 仅支持动态 sql 语句执行。动态执行的 sql 语句是已经构建/准备好的,在运行时执行。由于静态执行的性能优于动态执行,因此,db2 luw 中的嵌入式 sql 应用程序的表现非常良好。 包维护:为静态执行创建的包存储在数据库中,所以,如果嵌入式 sql 语句中发生任何变化,都需要重新绑定包。仅对静态 sql 执行有这样的要求,对动态 sql 执行没有这样的要求。如果存储在包中的 sql 语句中的数据库对象引用发生了改变,那么该包需要重新绑定。 precompile 阶段需要数据库连接:在 precompile 阶段,需要数据库连接。
