Nanda Pilaka
IBM Corporation
2004 年 4 月 构建 SQL 过程中常见的错误源于编译器环境的错误配置。本文简明地解释了为构建 SQL 过程设置环境的过程。DB2 Version 7,fixpak 3 的版本信息提供了其他平台上默认编译命令的更多示例。
简介
IBM DB2® UDB Version 7 引入了 SQL 过程,作为它其中的一个新功能。SQL 过程是指用 SQL 语言编写的存储过程。本文讨论了设置环境以构建和部署 SQL 过程的过程。将 SQL 过程转换成 C 语言代码之后,就编译该代码来构建存储过程库。Windows®、OS/2®、UNIX®、OS/390® 以及 OS/400® 平台上均支持这些 SQL 过程。本文与 Windows、OS/2 和 UNIX 平台相关。
先决条件
要在一台机器上构建 SQL 过程,需要安装两个产品:
- Application Development Client(ADC),其中包含开发 DB2 应用程序所需的所有库、头文件、预编译器,等等。
- 一个支持 DB2 的 C 编译器。
关于平台所提供的支持 DB2 的 C 编译器的清单,请查阅 Application Building Guide。
设置环境
正如前面提到的,DB2 将 SQL 过程转换成 C 代码,此代码随后则被编译成存储过程库。为了编译该代码,必须配置 DB2 以检测所安装的 C 编译器。
为了配置 DB2 以检测所安装的 C 编译器:
- 创建用以为编译器设置环境的可执行文件。该文件将是 Windows 上的批(.bat)文件、OS/2 上的命令(.cmd)文件或 UNIX 上的 shell 脚本。设置编译器环境将包括更新
PATH、INCLUDE 和 LIB 环境变量。
- 通过发出下列命令,更新 DB2 注册表变量
DB2_SQLROUTINE_COMPILER_PATH 以指向第 1 步所创建的可执行文件:
db2set DB2_SQLROUTINE_COMPILER_PATH=
full_path_to_executable_file
|
注意:在 Windows NT® 和 Windows 2000 上,只要已将编译器的环境变量存作 SYSTEM 变量,就无需设置以上注册表变量。
DB2 还提供了每个平台上默认的可执行文件,用以为该平台所支持的其中一个(默认的)编译器设置环境。其默认的文件名和位置取决于平台:
- 在 Windows 上:
%DB2PATH%\\sqllib\\function\\routine\\sr_cpath.bat
- 在 OS/2 上:
%DB2PATH%\\sqllib\\function\\routine\\sr_cpath.cmd
- 在 UNIX 上:
$HOME/sqllib/function/routine/sr_cpath
默认情况下,DB2 会将 DB2_SQLROUTINE_COMPILER_PATH 设置为上面的其中一个文件,除非已将其注册表变量修改为指向一个不同的文件。因此,如果安装了默认的 C 编译器并且打算将之用于开发,就无需创建一个单独的可执行文件来设置编译器环境。
应检查上述文件的内容以确保它们正确反映了焦点平台中默认编译器的环境设置。例如,在 Windows NT 和 Windows 2000 上, sr_cpath.bat 文件假定 Microsoft Visual C++® Version 6 安装在 C:\\Program Files\\Microsoft Visual Studio 之下。如果它安装在 D:\\Microsoft Visual Studio 之下,那么该文件的内容就需要进行修改。
另一个常见的错误就是对该文件进行了所有的正确修改,但却保留了编译器环境设置命令周围的注释。再次检查 sr_cpath.bat 文件的内容,您将注意到该文件中所有行都以 REM 关键字开头。REM 关键字用于注释行的开始,所以应将之删除以便设置编译器环境。
编译转换过来的 C 代码
在配置完 DB2 以检测编译器环境之后,就需要配置它,以使用针对所安装的编译器的编译命令。这将通过将另一个 DB2 注册表变量 DB2_SQLROUTINE_COMPILE_COMMAND 设置为所安装编译器的编译命令来完成。 DB2_SQLROUTINE_COMPILE_COMMAND 将被设置为该平台上默认编译器的一个默认的编译命令。以下是 AIX®、Solaris® 和 Windows 平台上默认编译命令的示例:
在 AIX 上,用于 AIX Version 3.6.6 的 IBM C Set++ 的默认编译命令为:
xlC_r -+ -H512 -T512 -I$HOME/sqllib/include SQLROUTINE_FILENAME.c \ -bE:SQLROUTINE_FILENAME.exp -e SQLROUTINE_ENTRY \ -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -lc -ldb2
|
在 Solaris 上,SPARC Compiler C++ Version 4.2 和 5.0 的默认编译命令为:
cc -# -Kpic -I$HOME/sqllib/include SQLROUTINE_FILENAME.c -G \ -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -R$HOME/sqllib/lib -ldb2
|
在 Windows 上,Microsoft Visual C++ Version 5.0 和 6.0 的默认编译命令为:
cl -Od -W2 /TC -D_X86_=1 -I%DB2PATH%\\include SQLROUTINE_FILENAME.c
/link -dll -def:SQLROUTINE_FILENAME.def /out:SQLROUTINE_FILENAME.dll
%DB2PATH%\\lib\\db2api.lib
|
注意:以上 AIX 和 Solaris 平台上的‘\’用于指示回车。对于 Windows 平台,其整个命令就是连续的一行,不用‘\’来指示回车符。
定制编译命令
如果安装不同的编译器(因而需要不同的编译命令),或者如果定制默认的编译选项,那么您就需要将 DB2_SQLROUTINE_COMPILE_COMMAND 设置为定制的编译命令。下列示例展示了如何指定以上所示每个默认编译命令的调试选项(用以返回调试信息):
要在 AIX 平台上返回调试信息,就要在默认的编译命令中添加 -g 选项并且更新 DB2_SQLROUTINE_COMPILE_COMMAND ,如下所示:
db2set DB2_SQLROUTINE_COMPILE_COMMAND=攛lC_r -+ -H512 -T512 -g \ -I$HOME/sqllib/include SQLROUTINE_FILENAME.c \ -bE:SQLROUTINE_FILENAME.exp -e SQLROUTINE_ENTRY \ -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -lc -ldb2
|
要在 Solaris 平台上返回调试信息,就要在默认的编译命令中添加 -g 选项并且更新 DB2_SQLROUTINE_COMPILE_COMMAND ,如下所示:
db2set DB2_SQLROUTINE_COMPILE_COMMAND=攃c -# -Kpic -g \ -I$HOME/sqllib/include SQLROUTINE_FILENAME.c -G \ -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -R$HOME/sqllib/lib -ldb2
|
要在 Windows 平台上返回调试信息,就要更新 DB2_SQLROUTINE_COMPILE_COMMAND ,如下所示:
db2set DB2_SQLROUTINE_COMPILE_COMMAND=cl -Od -W2 /TC -D_X86_=1
-I%DB2PATH%\\include SQLROUTINE_FILENAME.c /link -dll
-def:SQLROUTINE_FILENAME.def /out:SQLROUTINE_FILENAME.dll
-debug:full -pdb:none -debugtype:cv %DB2PATH%\\lib\\db2api.lib
|
再次请注意在 Windows 平台上,编译命令应按一行连续输入。
恢复为默认的编译命令
将 DB2_SQLROUTINE_COMPILE_COMMAND 设置为空将会恢复默认的编译命令和选项。其设置如下所示:
db2set DB2_SQLROUTINE_COMPILE_COMMAND=
|
结束语
构建 SQL 过程有两个主要步骤:
- 安装编译器并配置 DB2 以检测编译器环境。这是通过创建用以设置编译器环境(
PATH、LIB 和 INCLUDE 环境变量)的可执行文件,以及将 DB2_SQLROUTINE_COMPILER_PATH 设置为该文件来完成的。可使用默认的可执行文件( sr_cpath/sr_cpath.bat/sr_cpath.cmd )或创建新文件来为不同的编译器设置编译器环境。
- 将
DB2_SQLROUTINE_COMPILE_COMMAND 设置为一个编译命令。可使用默认的编译命令或者将 DB2_SQLROUTINE_COMPILE_COMMAND 设置为一个定制的编译命令(例如添加调试选项、64 位选项,等等)。
构建 SQL 过程中常见的错误源于编译器环境的错误配置。本文简明地解释了为构建 SQL 过程设置环境的过程。DB2 Version 7,fixpak 3 的版本信息提供了其他平台上默认编译命令的更多示例。
关于作者
Nanda Pilaka可通过 nandap@us.ibm.com联系到。 |
|