处理SQL语句,为程序做准备

准备运行SQL应用程序的第一步是处理程序中的SQL语句。 如需处理您的留言,请发送邮件至 Db2 coprocessorDb2 precompiler。 在此步骤中,SQL语句被替换为对 Db2 语言接口模块的调用,并创建一个DBRM。

准备工作

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

关于本任务

由于大多数编译器无法识别 SQL 语句,因此您可以使用 Db2 coprocessorDb2 precompiler 来避免编译器错误。

您可以使用 Db2 coprocessor 作为主机语言。 当您使用 Db2 coprocessor 时,编译器(而非 Db2 precompiler )会扫描程序并返回修改后的源代码。 Db2 coprocessor 还生产DBRM。

提示: 更改开始 Db2 coprocessor 是应用程序中处理SQL语句的推荐方法。 与 Db2 precompiler 相比, Db2 coprocessor 对SQL程序的限制更少,并且更全面地支持最新的SQL和编程语言增强功能。 参见使用 Db2 协处理器处理SQL语句更改结束

Db2 precompiler 会扫描程序并返回修改后的源代码,您可以对其进行编译和链接编辑。 预编译器还会生成一个DBRM(数据库请求模块)。 您可以使用BIND子命令将此DBRM绑定到一个软件包中。 完成这些步骤后,您可以运行您的 Db2 应用程序。

Db2 DSNHDECP模块版本
当您在程序中处理 SQL 语句时,如果 DSNHDECP 中的 Db2 版本是系统提供的默认版本,则 Db2 会发出警告,但处理仍会继续。 在这种情况下,请确保 Db2 在 DSNHDECP 中使用的信息准确反映了您的环境。

过程

要在应用程序中处理SQL语句,请使用以下方法之一:

  • 在编译程序时,请使用您正在使用的编程语言的 Db2 coprocessor 。 您可以使用 C、C++、 COBOL 和 PL/I 主机编译器 Db2 coprocessor
    要调用 Db2 coprocessor ,请指定SQL编译器选项及其子选项,这些子选项是为 Db2 precompiler 定义的选项。 一些 Db2 precompiler 选项被忽略。 更改开始您还可以从 z/OS® 上的 UNIX 系统服务调用 Db2 coprocessor ,在分区数据集或 HFS 文件中生成 DBRM。 更改结束

    更多信息,请参阅 《使用 Db2 协处理器处理SQL语句 》。

  • 在编译程序前,请使用 Db2 precompiler 。 更多信息,请参阅 《使用 Db2 预编译器处理SQL语句 》。
    对于汇编程序或 Fortran 应用程序,请使用 Db2 precompiler 来准备SQL语句。

结果

Db2 coprocessorDb2 precompiler 输出

Db2 coprocessorDb2 precompiler 的主要输出是一个数据库请求模块(DBRM)。 但是, Db2 coprocessorDb2 precompiler 也会生成修改后的源语句、源语句列表、引用主机名和列的语句列表以及诊断信息。 更多信息,请参阅 Db2 预编译器的输出

语义检查的 Db2 coprocessor 局限性 Db2 precompiler

Db2 coprocessor 程序对SQL语句中的 Db2 precompiler 数据引用进行有限的语义检查。 这些检查是针对程序中的表声明进行的,而非针对 Db2 目录。

Db2 precompilerDb2 coprocessor 处理SQL语句时执行的语义检查示例如下:

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

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

后续操作

如果应用程序包含 CICS® 命令,则必须在编译前翻译程序。 更多信息,请参阅 CICS 程序中命令级语句的翻译