编译时,您可以使用 Db2 coprocessor 来处理 SQL 语句。 使用 Db2 coprocessor ,编译器会扫描程序,并将所有SQL语句和主机变量信息复制到数据库请求模块(DBRM)中。 Db2 coprocessor 是应用程序中处理SQL语句的推荐方法。 与 Db2 precompiler 相比, Db2 coprocessor 对SQL程序的限制更少,并且更全面地支持最新的SQL和编程语言增强功能。
准备工作
确保您的应用程序开发编程语言符合 Db2 12 程序目录中 “使用 Db2 coprocessor 构建应用程序”中列出的最低要求。 请参阅 Db2 12的程序目录。
关于本任务
Db2 coprocessor 在编译时处理SQL语句。
图 1。 包含嵌入式SQL的应用程序的准备过程概述。 Db2 协处理器可以合并某些语言的预编译和编译步骤。
例外情况: 对于 ` PL/I `,该函数由 ` PL/IDb2 coprocessor ` 预处理器调用,而非编译器。
Db2 coprocessor 是应用程序中处理SQL语句的推荐方法。 与 Db2 precompiler 相比, Db2 coprocessor 对SQL程序的限制更少,并且更全面地支持最新的SQL和编程语言增强功能。
例如,当您使用
Db2 coprocessor 处理SQL语句时,可以在程序中执行以下操作:
- 使用结构化主机变量的全限定名称。
- 在嵌套程序的任何级别都包含SQL语句,而不仅仅是在顶层源文件中。(虽然可以在嵌套程序的任何级别包含 SQL 语句,但必须将整个程序作为一个单元进行编译。)
- 使用嵌套的SQL INCLUDE语句。
- 仅适用于C或C++程序,请使用可变长度格式编写应用程序。
- 仅对于C或C++程序,当程序使用不同的代码页时,使用与代码页相关的字符,例如左括号和右括号,而不使用三字符表示法。
过程
要使用 Db2 coprocessor 处理SQL语句,请执行下列操作之一:
- 提交一个JCL作业来处理SQL语句。 包含以下信息:
- 在编译程序时指定SQL编译器选项:
SQL编译器选项表明您希望编译器调用 Db2 coprocessor。 在SQL关键字后用括号指定SQL处理选项列表。 表1 列出了您可以指定的选项。
对于 COBOL 和 PL/I ,请将 SQL 处理选项列表用单引号或双引号括起来。 对于 PL/I ,请用逗号、空格或两者交替分隔列表中的选项,如下例所示:
| C/C++ |
SQL(APOSTSQL STDSQL(NO)) |
| COBOL |
SQL("APOSTSQL STDSQL(NO)") |
| PL/I |
PP(SQL("APOSTSQL,STDSQL(NO)") |
- 对于使用 BIGINT 或 LOB 数据类型的 PL/I 程序,在编译程序时请指定以下编译器选项:
LIMITS(FIXEDBIN(63), FIXEDDEC(31))
- 如果需要,请增大用户区域的大小,以便为 Db2 coprocessor 提供更多的内存。
- 在编译步骤的JCL中为以下数据集添加DD语句:
- Db2 载入库 (前缀.SDSNLOAD)
- Db2 coprocessor 调用 Db2 模块来处理SQL语句。 因此,在编译器的STEPLIB连接中,您需要包含 Db2 加载库数据集的名称。
- DBRM 图书馆
- Db2 coprocessor 生成 DBRM。 DBRM和DBRM库在 Db2 协处理器的输出中进行了描述。 您需要添加一个DBRMLIB DD语句,用于指定DBRM库数据集。
- SQL INCLUDE语句库
- 如果您的程序包含SQL INCLUDE 成员名称语句,用于指定源程序的辅助输入,则还需要为成员名称指定数据集。 在编译步骤的 SYSLIB 串联中包含包含成员名称的数据集名称。
请从 z/OS® UNIX System Services 调用 Db2 coprocessor 。
如果您从
z/OS UNIX System Services 调用
Db2 coprocessor ,可以选择在分区数据集或 HFS 文件中生成 DBRM。
当您调用 Db2 coprocessor 时,请指定SQL编译器选项。 SQL编译器选项表明您希望编译器调用 Db2 coprocessor。 在SQL关键字后用括号指定SQL处理选项列表。 有关可指定的选项列表,请参阅 SQL处理选项。
DBRM的文件名按照DRBMLIB中的描述确定。
对于C和C++以外的主机语言,不支持DBRMLIB选项,文件名始终是生成的。
对于C和C++,您可以指定以下选项之一:
- 分区数据集的名称。 以下示例调用C/C++ Db2 coprocessor (使用 c89 编译器)编译一个示例C程序,并要求将生成的DBRM存储在 userid.dbrmlib.data 数据集的test成员中:
c89 -Wc,"sql,dbrmlib(//'userid.dbrmlib.data(test)'),langlvl(extended)" -c t.c
- HFS文件的名称。 名称可以是限定性的、部分限定性的或非限定性的。 文件路径最多可包含1024个字符,文件名最多可包含255个字符。 文件名的前8个字符(不包括文件扩展名)在文件系统中必须唯一。
例如,假设您的目录结构为 /u/USR001/c/example ,当前工作目录为 /u/USR001/c。 下表举例说明了如何使用DBRMLIB选项指定HFS文件名以及如何解析文件名。
表 1. 如何指定HFS文件来存储DBRM
| 如果您指定…… |
DBRM生成于...... |
dbrmlib(/u/USR001/sample.dbrm) |
/u/USR001/sample.dbrm |
dbrmlib(example/sample.dbrm) |
/u/USR001/c/example/sample.dbrm |
dbrmlib(../sample.dbrm) |
/u/USR001/sample.dbrm |
dbrmlib(sample.dbrm) |
/u/USR001/c/sample.dbrm |
以下示例调用 Db2 coprocessor (使用 c89 编译器)编译一个示例C程序,并要求将生成的DBRM存储在 tmp 目录下的 test.dbrm 文件中:
c89 -Wc,"sql,dbrmlib(/tmp/test.dbrm),langlvl(extended)" -c t.c

以下示例调用
Db2 coprocessor 编译一个示例 COBOL 程序,使用 Enterprise COBOL 针对
z/OS 6.2 或更高版本的编译器:
cob2 myprogram.cbl -c myprogram -dbrmlib -qsql


以下示例调用
Db2 coprocessor 来编译来自 Enterprise PL/I 的示例 PL/I 程序,适用于
z/OS 5.2 或更高版本的编译器:
pli -c -qpp=sql -qdbrmlib -qrent myprogram.pli

如果您要求以 HFS 文件格式生成 DBRM,则可以使用 Db2 command line processor BIND 命令绑定生成的 DBRM。 有关使用 Db2 command line processor BIND命令的更多信息,请参阅将HFS文件中的DBRM绑定到软件包或集合。 您也可以选择使用 oput 和 oget 命令将 DBRM 复制到分区数据集成员中,然后使用常规 JCL 绑定 DBRM。
结果
Db2 coprocessor 的主要输出是一个数据库请求模块(DBRM)。 然而, Db2 coprocessor 还生成修改后的源语句、源语句列表、引用主机名和列的语句列表以及诊断信息。 更多信息,请参阅 Db2 协处理器的输出。