在路上...

导航

 
 
英文原文

在 Windows 中用 GCC 编译 DB2 UDB 存储过程

Jim Haungs
IBM WebSphere 业务整合部
Burlingame, CA
2003 年 10 月

©2003 IBM 公司版权所有

重要提示: 在阅读本文前请阅读放弃权利声明

 
  内容  
简介
安装GCC
编辑脚本(最重要的步骤)
它是如何工作的
测试使用 DB2 UDB 的安装
总结
放弃权利声明
致谢
下载

简介

以前,在 DB2 中使用存储过程需要另外安装 C 编译器(有时这需要很高的费用)。本文中给出的解决方案描述了如何安装和使用 GNU C 编译器(GCC),一个自由的开放源代码的 C 编译器。

DB2 UDB 存储过程使用 SQL 过程语言(SQL PL)编写。当 DB2 UDB 编译存储过程时,它首先将 SQL PL 转换成 C 语言,然后将转换得到的 C 程序编译为 DLL(动态链接库)。当运行过程时,DB2 将该 DLL 载入内存,并调用该 DLL 的主入口点。

该过程有以下几步:

  1. 安装 GCC 编译器及相关实用程序。
  2. 创建一个 DB2 编译存储过程所使用的批处理脚本。
  3. 创建一个编译器和链接器所需的帮助文件。
  4. 配置 DB2 以使用新的文件和脚本。
  5. 安装测试。

根据您的连接速度,整个过程将持续一个小时左右时间。

安装GCC

安 装 GCC 最快捷的方式是在您的机器上安装完整的 Cygwin 环境。Cygwin 是 Windows 上类似于 Linux 的环境。它包括一个提供 UNIX 功能性基本子集的 DLL 以及在这之上的一组工具。安装好 Cygwin 之后,通常可以忽略它,即使您是命令行的爱好者,您仍能发现您活得更舒坦了。

确保您具有相当快速的 Internet 连接。GCC 编译器及相关实用程序大约有 50 兆字节。另外确认您的连接是否需要一个代理服务器。这可通过您的 Internet 浏览器选项:工具 -> Internet 选项 -> 连接 -> 局域网(LAN)设置 来确定。

确保在您的管理员帐户下安装这个程序,并选择为“所有用户”安装。

将您的 Internet 浏览器指到 www.cygwin.com。在屏幕的中央是一个黑绿两色组成的 “C” 徽标,标题是“Install or update now.”。在该链接上点击,这将下载一个小程序 setup.exe(250KB)。这个安装程序将在您的机器上引导 Cygwin 环境的安装或更新过程。

运行安装程序

将 setup.exe 下载到一个已知地方,如桌面,然后运行它。

它将打开安装向导,如下图所示:

图 1. Cygwin 环境的安装向导
Setup wizard for Cygwin environment

点击 Next 按钮。

选择下载位置

在这个页面上,选择"Install from Internet"。

图 2. 选择安装类型
Choose installation type

点击 Next 按钮。

选择一个安装目录

在这个页面上,选择执行 Cygwin 所在的目录。

设置图3所示的剩余选项。

图 3.选择一个安装目录
Choose an installation directory

点击 Next 按钮。

选择一个临时安装目录

在这个页面(图4),为安装包选择一个临时目录。当 Cygwin 安装完成后,您可以删除这个目录和它的内容。

注意安装程序记住了这个目录,并在更新时只下载比这个目录中的包更新的版本。如果您删除这个目录并重新安装,setup 将重新安装您选择的所有内容而不管这些包的安装程序在运行目录中已经存在。

图 4. 选择一个临时安装目录
Choose a temporary installation directory

点击 Next 按钮。

指定您的 Internet 连接

在这个页面上(图5),指定 Internet 连接。如果你有代理服务器,选择“使用 IE5 设置”,或从您的浏览器选项获得服务器名,选择使用代理,然后输入代理服务器的主机名和端口号。

图 5. 选择连接类型
Choose connection type

点击 Next 按钮。

选择下载站点

在这个页面上(图6),选择一个下载站点。因为这些站点是义务的镜像,所以选择一个下载点有点风险(通常它们是可用的,但有时不可用)。通常,试试离你比较近的那个站点。

图6. 选择一个下载站点
Choose a download site

点击 Next 按钮。

选择包进行安装

在这个页面上,您将选择要安装的包。默认情况下,Cygwin 基本包将不安装 GCC,因此,您必须修改默认设置。

将鼠标移动到 Devel 边的加号(+)上,然后点击它展开 Devel 类。

图 7. 选择包进行安装
Choose packages to install

您会看到在 Devel 下有许多入口,其中只有三个是您需要的,次序如下:

  1. binutils
  2. gcc
  3. gcc-mingw

不是所有默认的基本包都需要运行 GCC,但它们不太大,因此为简单化,就安装它们。

注意很容易选错包或版本,尤其在重新安装的时候,因为选择窗口中的循环按钮是不标准的。在这一步我们建议的就是多加小心,尤其是有多个 GCC 版本的情况下。

为选择这三个包,点击列 New 中每个双向箭头直到显示每个包的版本号。根据您机器上已安装的以及镜像上所拥有的合适的版本,列入口在各图标间循环:

Figure 8

如果有多个版本可用,选择数字最大的一个。要下载二进制文件,确保选中了“Bin”列的复选框。

图 9. 下载二进制文件
Download binary files

完成下载

选择完三个包之后,Cygwin 就访问选择的镜像主机,然后下载那三个包以及默认的基本包。根据您的连接速度这将持续几分钟,在安装期间,将打开和关闭许多弹出窗口。

因为存放 Cygwin 安装的镜像站点是义务的,有时不可用或负荷过重。如果发现选择的镜像没有响应,就按取消 (Cancel),这将终止整个安装程序。

惟一的办法就是重新开始安装并选择另一个镜像;这非常让人感到沮丧。幸运的是,安装程序记住了大多数您上次所做的,因此通常取默认情况。在重新选择正确的包时必须小心,因为在后面的安装中不帮你选择这些内容。

setup 程序然后询问是否在您的桌面或开始菜单创建一个 Cygwin 快捷键。该快捷键启动 Cygwin shell (称为 bash), 这对我们计划中的 DB2 使用并不是必须的,但对测试我们的安装是有用的。因此让 setup 至少创建一个桌面快捷键。我们将在安装的后面使用它。

最后,点击 Finish 按钮。我们将在后面测试安装结果。

图 10. 完成安装
Completing installation

设置系统环境变量

当安装结束时,您必须创建或修改两个系统(不是用户)环境变量: PATH 和 DB2PATH。PATH 变量通常是存在的,但你必须创建 DB2PATH 变量。

在这个步骤后重启机器以确保所有新进程都继承了新的 PATH 和 DB2PATH 设置。

PATH: 因为 GCC 和 DLLWRAP 都调用其它 Cygwin 实用程序,它们的 bin 目录必须在 PATH 中。将 Cygwin bin 目录(在我们的例子中为 c:\\cygwin\\bin) 添加到您的系统PATH环境变量中,如下所示。

图 11. 添加到系统 PATH 环境变量
Appending to the System PATH environment variable

DB2PATH: DB2PATH 变量可用以下两种方式之一设置:在全局环境变量或在本地批处理文件中设置。如果在您的 DB2 路径(如 F:\\SQLLIBc:\\ibm\\sqllib)中有空格,则把它设置在批处理文件中同样能够工作。

如果在您的 DB2 路径(如 c:\\program files\\ibm\\sqllib)中有空格,则不同版本的 GCC 在查找文件时会有不同的问题。GCC 有时将空格前的文本和空格后的文本解释为两个不同的参数。

解决这个问题的惟一可靠的办法是在您的全局环境中设置 DB2PATH 环境变量,并在批处理文件中不使用 setlocalset 语句。显然,GCC 解析环境变量不同于命令行参数;如果空格来自于环境变量则路径中带空格没有问题。

图 12.  DB2PATH 环境变量
The DB2PATH environment variable

编辑脚本 (最重要的步骤)

这个部分是本文的要点。您将创建一个编辑脚本告诉 DB2 如何用 GCC 编译存储过程。它是如何工作的部分包含每一步的详细信息。

创建编辑脚本文件

在某个目录中创建一个新的文件或创建一个新的目录。在我们的例子中,我们将在 c:\\bin 目录中创建一个名为 db2gcc.bat 的文件。您可将文件放到您希望的任何地方,但必须确保该位置在 db2set 命令中是正确的,这我们在下一部分描述。

如果您在软拷贝上阅读此文,则你可直接将下面的文本剪切并粘贴到文本编辑器中,要注意将 dllwrap 保持在一行上。

列表 1. c:\\bin\\db2gcc.bat 文件

setlocal

REM Set the DB2PATH variable to your DB2 base path, e.g., c:\\ibm\\sqllib

set DB2PATH=c:\\ibm\\sqllib

gcc -c -g -mno-cygwin -I%DB2PATH%\\include %1.c -o %1.o

dllwrap -mno-cygwin -target i386-mingw32 -o %1.dll %1.o

%DB2PATH%\\lib\\db2api.lib --def c:\\bin\\standard.def

告诉 DB2 脚本文件在哪里

在 windows 命令提示符下键入以下命令:
db2set DB2_SQLROUTINE_COMPILE_COMMAND="c:\\bin\\db2gcc.bat SQLROUTINE_FILENAME"

这个只做一次。注意在 db2set 命令后及路径名后有一个空格;在命令中没有其它空格;还要注意下划线和引号的位置。

文件路径是新创建的 db2gcc.bat 文件的绝对路径

创建 standard.def 文件

这个文件定义了由生成的 C 过程导出的入口点。该入口点对每个过程都是一样的。standard.def 文件可放在任何地方,只要给批处理文件中 dllwrap 命令正确的路径(如 创建编辑脚本文件中所描述的)。

列表 2. standard.def 文件

EXPORTS 
pgsjmp@8
pgsjmp=pgsjmp@8

它是如何工作的

当 DB2 将您的存储过程编译为 C 语言时,它生成一个 .C 文件,文件名带一个随机数字;通常该文件名为 Pnnnnnnn.C,这里的 n 是数字。当生成这个文件后,DB2 将这个名字存入到环境变量 SQLROUTINE_FILENAME 中。

要编译这个存储过程,DB2 调用 db2gcc.bat 文件,将环境变量中的不带 .C 扩展的文件名传递到批处理文件的第一个输入参数中 (%1)。批处理脚本添加所需的文件扩展名(c, o, dll) ,然后 GCC 将 C 文件编译为一个目标(.o)文件。然后 dllwrap 调用链接器 (ld), 将目标文件加上 DB2 运行库,加上 standard.def 文件绑定生成一个 DLL (动态链接库),这个文件最终由 DB2 服务器载入并运行。

请注意有关这个批处理文件的几个方面:

  • 这个批处理文件是在将您的存储过程转换成 C 之后调用的。
  • 必须将 DB2PATH 环境变量设置到您机器上的 DB2 基本目录中;这个文件用于找到 DB2 include 文件和链接库。可通过批处理文件或全局系统环境变量来实现。参见 设置系统环境变量 部分。
  • dllwrap 命令必须在一行内输入。

这个功能的每个命令和参数如下:

  • setlocal 防止 set DB2PATH 命令修改您的全局命令行环境。
  • set 创建一个包含 DB2 include 文件 (db2\\include) 和目标库 (db2\\lib) 路径的本地环境变量。
  • gcc 将 C 文件编译到一个目标文件
  • -c 表示只做编译(不链接)
  • -g 表示包含调试信息
  • -mno-cygwin 表示“不从 Cygwin 环境生成代码”
  • -I 指出 DB2 include 头文件的路径
  • %1.c 是生成的 C 文件的名字 
  • %1.o 是编译的目标文件的名字
  • dllwrap 从目标文件,DB2 链接文件和 standard.def 文件创建 DLL 文件。它实际上几次调用链接器 (ld) 和 dlltool,每次创建一个最终的 DLL。
  • -target 显示目标机器结构 (386) 和运行时间库 (mingw32 = Windows 32下最小的 GNU)。Mingw32 库是已有的 MSVCRTnn.DLL 库(通常在 \\windows 或者 \\winnt 目录中)上一个薄的层。因此,它使用每个 Windows 系统上可用的 C 运行时间库。
  • standard.def 包含导出的被编译的过程的入口点名。因为每个 DB2 过程的这个名字都一样,所以一个标准的文件就足够了。

测试使用 DB2 UDB 的安装

测试您的 GCC 安装

为测试 GCC 安装,运行 Cygwin shell 并输入 (注意: 两个破折号):
    gcc --version

输出结果类似如下:
    gcc (GCC) 3.2 20020927 (prerelease)

创建一个样例过程。

在这个样例文件 sample.clp 中,感叹号作为 DB2 命令的分隔符。

注意 connect 命令的语法是:

connect to <database> user <id> using <password>

您必须根据您的安装来调整参数值。

列表 3. sample.clp 文件

connect to sample user db2admin USING somepassword!

drop table result!
create table result (text VARCHAR(80))!

drop procedure TestProcedure!
create procedure TestProcedure ()
BEGIN
insert
into result (text)
values ('If you can read this, it worked.');
END!

call TestProcedure!
select text from result!

terminate!

编译样例过程

这个命令仅用于测试您的安装。实际上,DB2 自动调用一个类似的命令,该命令处理生成的 C 文件。

打开命令 shell, Windows 或 Cygwin。输入命令 db2cmd 创建一个 DB2 命令窗口;这将打开另一个命令 shell。

以下命令用 db2set 命令中配置的 db2gcc.bat 脚本编译样例过程。确保在你创建的 sample.clp 文件的同一目录中运行这条命令。
    db2 -td! -v -fsample.clp

每条命令的功能如下:

  • db2 调用 DB2 命令处理器
  • -td! 设置感叹号 (!) 作为语句终止符,这应当与你在 sample.clp 文件中使用的一致。
  • -v 告诉命令行处理器将命令文本反映到标准输出。
  • -fsample.clp 命名 DB2 应编译的文件。注意在 -f参数后没有空格。

成功地编译和运行之后,检查有无出错信息及表结果如下:
    If you can read this, it worked.

列表 4. 编译和运行样例过程

C:\\bin\\db2\\FUNCTION\\ROUTINE>db2 -td! -v -fsample.clp
connect to sample user db2admin USING

Database Connection Information
Database server = DB2/NT 8.1.0
SQL authorization ID = DB2ADMIN
Local database alias = SAMPLE


drop table result
DB20000I The SQL command completed successfully.

create table result (text VARCHAR(80))
DB20000I The SQL command completed successfully.

drop procedure TestProcedure
DB20000I The SQL command completed successfully.

create procedure TestProcedure()
BEGIN
insert
into result (text)
values ('If you can read this, it worked.');
END
DB20000I The SQL command completed successfully.

call TestProcedure
Return Status = 0

select text from result

TEXT
--------------------------------------------------------------------------
If you can read this, it worked.

1 record(s) selected.


terminate
DB20000I The TERMINATE command completed successfully.

总结

就是这样。从 DB2 开发中心或作为 Websphere Business Integration 系统管理器的关联编译存储过程,现在都可以调用 db2gcc 批处理文件,被编译的过程会作为 DB2 进程中的 DLL 正确运行。

放弃权利声明

本文中包含的配置建议不是由 IBM 官方支持的,而是来自于特定的操作系统和环境。在给定的情况下验证信息的正确性时,在您操作环境下获得的结果可能相差很大。因此,IBM 不提供任何结果或性能方面的代表,保证,担保或授权。

致谢

感谢 Garfield Lewis 解决如何使用 dllwrap 来避免 GCC 的 DLL 重定位的限制。感谢 Kyle Brown, Gustavo Arocena, Paul Yip, and Maxime Tiran 回答我无休止的问题以及感谢 Juraj Suja 帮助进行 Cygwin 屏幕拷贝。另外感谢我的经理 Tom Reed 给我研究这个问题的时间和动力。

下载

文件名 目的 注释
sample-db2gcc.bat 编辑脚本 用户必须修改 DB2PATH 语句
sample-db2set.bat如何使用 db2set 的例子 给出的文件名必须与 "创建编辑脚本文件"中的相匹配
standard.def 标准输出文件 该文件总是相同的。
sample.clp 样例存储过程 用户必须修改数据库名,用户标识和口令。
sample-test.clp 如何运行过程的例子 文件名必须与 "创建样例过程"的相匹配。

描述 文件类型 文件大小 下载方式
haungssamples.zip zip 3 KB HTTPHTTP download

到首页

关于作者

Jim Haungs 是 Burlingame 实验室课程开发人员,开发 WebSphere 业务整合课程。他自 1974 年开始设计和开发软件。他在 RIT 获得计算机科学学士学位,在 Wang 学院获得软件工程硕士学位。在到 IBM 之前,他在 Oracle, Coopers & Lybrand, Lotus, Wang 实验室工作过,并成功过管理致力于对象技术的咨询公司。

DB2, DB2 UDB, IBM, WebSphere

Windows

其它公司

posted on 2005-02-09 01:14  AK747  阅读(6369)  评论(2编辑  收藏  举报