更改开始

使用 Db2 coprocessor

更改开始编译时,您可以使用 Db2 coprocessor 来处理 SQL 语句。 使用 Db2 coprocessor ,编译器会扫描程序,并将所有SQL语句和主机变量信息复制到数据库请求模块(DBRM)中。 Db2 coprocessor 是应用程序中处理SQL语句的推荐方法。 与 Db2 precompiler 相比, Db2 coprocessor 对SQL程序的限制更少,并且更全面地支持最新的SQL和编程语言增强功能。更改结束

准备工作

确保您的应用程序开发编程语言符合 Db2 12 程序目录中 “使用 Db2 coprocessor 构建应用程序”中列出的最低要求。 请参阅 Db2 12的程序目录

提示: 在运行前 Db2 coprocessor,请使用声明生成器(DCLGEN)获取精确的SQL DECLARE TABLE语句。 该程序 Db2 coprocessor 仅对表和列引用进行有限检查,检查依据是SQL DECLARE TABLE语句,而非目录 Db2 中的实际表和列。 有关详细信息,请阅使用 DCLGEN 生成表和视图声明。

关于本任务

Db2 coprocessor 在编译时处理SQL语句。

图 1。 包含嵌入式SQL的应用程序的准备过程概述。 Db2 协处理器可以合并某些语言的预编译和编译步骤。
开始图描述。 该图显示,您预先编译SQL语句,然后在运行 DB2 应用程序之前将DBRM绑定到计划或包。 或者, DB2 协处理器将预编译和编译步骤结合在一起,不会为您的应用程序创建修改后的源代码。 结束图描述。
例外情况: 对于 ` PL/I `,该函数由 ` PL/IDb2 coprocessor ` 预处理器调用,而非编译器。

更改开始在应用程序中处理SQL语句时,推荐使用 Db2 coprocessor 该方法。 相较于 Db2 precompiler,对SQL程序 Db2 coprocessor 的限制更少,并更全面地支持最新的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 串联中包含包含成员名称的数据集名称。
  • 更改开始调用 Db2 coprocessor 来自 z/OS® UNIX System Services更改结束
    如果您从 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

Db2 coprocessor 的主要输出是一个数据库请求模块(DBRM)。 然而, Db2 coprocessor 还生成修改后的源语句、源语句列表、引用主机名和列的语句列表以及诊断信息。 更多信息,请参阅 Db2 协处理器的输出

语义检查的局限性 Db2 coprocessor

该程序对SQL语句 Db2 coprocessor 中的数据引用进行有限的语义检查。 这些检查是针对程序中的表声明进行的,而非针对 Db2 目录。 SQL处理器 Db2 coprocessor 在处理SQL语句时执行的语义检查包括以下检查:

  • 该程序至少包含一个表声明,如果其中包含表或列引用。
  • 对于单行SELECT语句,INTO 主机变量子句的数量与选择列表值的数量相匹配,且每个主机变量具有兼容的类型。
  • 对于UPDATE语句,每个被设置的列与它被设置的值兼容。
  • 对于INSERT语句,插入值的数量不超过表的列数,且插入值的类型兼容。
  • 对DATE和TIME值进行有限有效性检查,允许使用CHAR数据类型。
  • 对于所有SQL语句,算术运算的操作数均为数值类型,而BETWEEN或IN等关系运算的操作数需相互兼容。

语义检查在不存在表列表的情况下终止,例如语句包含嵌套表表达式或连接时。 此外,当IN列表谓词包含子查询时,语义检查将跳过该谓词中列的兼容性检查。 在这些情况下,前文所述的检查可延迟至绑定过程执行,而对列和表引用的完整检查始终延迟至绑定过程,此时这些引用将与 Db2 目录进行比对验证。

更改结束