DB2 V9.7 for Linux, UNIX, and Windows

使用 PRECOMPILE 命令来预编译嵌入式 SQL 应用程序

创建嵌入式 SQL 应用程序的源文件之后,必须使用 PREP 命令(并指定特定于主语言的选项)对包含 SQL 语句的每个主语言文件进行预编译。预编译器将源文件中包含的 SQL 语句转换为注释,并为那些语句生成 DB2® 运行时 API 调用。

必须始终针对特定数据库预编译源文件,即使最终并不将该数据库与该应用程序配合使用亦如此。在实践中,您可以使用测试数据库来进行开发,在对应用程序进行充分测试之后,可以将它的绑定文件与一个或多个生产数据库绑定。此实践称为延期绑定

注: 不支持在版本比执行预编译的客户机低的客户机上运行嵌入式应用程序,这与该应用程序的编译位置无关。例如,在 DB2 V9.5 客户机上预编译嵌入式应用程序之后,不支持尝试在 DB2 V9.1 客户机上运行该应用程序。
如果应用程序使用的代码页与数据库代码页不同,那么您需要考虑执行预编译时使用哪个代码页。

如果应用程序使用用户定义的函数 (UDF) 或用户定义的单值类型(UDT),那么在预编译应用程序时,可能需要使用 FUNCPATH 选项。此选项指定用来为包含静态 SQL 的应用程序解析 UDF 和 UDT 的函数路径。如果未指定 FUNCPATH,那么缺省函数路径是 SYSIBM > SYSFUN > USER,其中 USER 是指当前用户标识。

在预编译应用程序之前,必须以隐式或显式方式连接到服务器。虽然您在客户机工作站上预编译应用程序,并且预编译器在客户机上生成经过修改的源代码和消息,但预编译器使用服务器连接来执行部分验证。

预编译器还将创建数据库管理器对数据库处理 SQL 语句时所需的信息。此信息存储在程序包和/或绑定文件中,这取决于您选择的预编译器选项。

下面是使用预编译器的典型示例。要预编译名为 filename.sqc 的 C 嵌入式 SQL 源文件,您可以发出以下命令以创建缺省名称为 filename.c 的 C 源文件以及缺省名称为 filename.bnd 的绑定文件:

   DB2 PREP filename.sqc BINDFILE
预编译器生成多达四种类型的输出:
经过修改的源代码
此文件是原始源文件在预编译器将 SQL 语句转换为 DB2 运行时 API 调用后生成的新版本。将为其指定适当的主语言扩展名。
程序包
如果使用 PACKAGE 选项(缺省值),或者未指定任何 BINDFILE、SYNTAX 或 SQLFLAG 选项,那么程序包将存储在所连接的数据库中。程序包只包含对此数据库发出特定源文件的静态 SQL 语句所需的所有信息。除非您使用 PACKAGE USING 选项来指定另一个名称,否则预编译器将使用源文件名的前 8 个字符来构造程序包名。

如果在未指定 SQLERROR CONTINUE 的情况下使用 PACKAGE 选项,那么预编译过程中使用的数据库必须包含源文件中的静态 SQL 语句所引用的所有数据库对象。例如,除非 SELECT 语句所引用的表存在于数据库中,否则无法预编译该语句。

借助 VERSION 选项,将对绑定文件(如果使用了 BINDFILE 选项)和程序包(如果在 PREP 时进行绑定或者单独进行绑定)指定特定的版本标识。多个具有相同名称和创建者的程序包版本可以同时存在。

绑定文件
如果使用了 BINDFILE 选项,那么预编译器将创建一个绑定文件(扩展名为 .bnd),此文件包含创建程序包时所需的数据。以后,可以将此文件与 BIND 命令配合使用,以便将该应用程序与一个或多个数据库绑定。如果指定了 BINDFILE,并且未指定 PACKAGE 选项,那么绑定将被延迟到您调用 BIND 命令时进行。注意,对于命令行处理器(CLP)而言,PREP 的缺省情况是不指定 BINDFILE 选项。因此,如果您正在使用 CLP,并且想延迟绑定,那么需要指定 BINDFILE 选项。

指定 SQLERROR CONTINUE 的作用是,即使绑定 SQL 语句时发生错误也会创建程序包。如果还指定了 VALIDATE RUN,那么可以在执行时以递增方式绑定那些由于授权或存在原因而未能绑定的语句。在运行时,尝试发出那些语句将生成错误。

消息文件
如果使用了 MESSAGES 选项,那么预编译器会将消息重定向到指定的文件。这些消息包括用于描述预编译期间遇到的问题的警告和错误消息。如果未能成功地预编译源文件,请使用警告和错误消息来确定问题,更正源文件,然后再次尝试预编译源文件。如果未使用 MESSAGES 选项,那么预编译消息将被写至标准输出。