发出SQL语句的C和C++应用程序

只要可以使用可执行语句,您就可以在C或C++程序中编写SQL语句。

C或C++程序中的每个SQL语句必须以EXEC SQL开头,以分号(;)结尾。EXEC和SQL关键字必须出现在同一行,但语句的其余部分可以出现在后续行中。

一般来说,由于C是区分大小写的,所以请使用大写字母输入所有SQL关键字。 但是,如果您使用FOLD预编译子选项, Db2 会将SBCS SQL普通标识符中的小写字母转换为大写。 有关主机语言预编译选项的信息,请参见表1

在整个程序中,必须保持宿主变量名称的一致性。 例如,如果一个主变量名称在声明时为小写,则它在所有SQL语句中都必须为小写。 您可以在C程序中编写如下UPDATE语句:

EXEC SQL
   UPDATE DSN8C10.DEPT
   SET MGRNO = :mgr_num
   WHERE DEPTNO = :int_dept;
注释
除了在关键字EXEC和SQL之间,您可以在SQL语句中任何可以使用空格的地方添加C注释(/*... */)。 您可以在C语言语句中使用单行注释(以//开头),但不能在嵌入式SQL中使用。 您可以在嵌入式 SQL 语句中使用 SQL 注释。 更多信息,请参阅 SQL注释

您可以嵌套评论。

要在注释中包含EBCDIC DBCS字符,必须使用换出和换入控制字符来分隔字符;DBCS字符串中的第一个换入字符表示DBCS字符串的结束。

SQL语句的继续
您可以使用反斜杠在下一行继续字符串常量或分隔标识符。 但是,EBCDIC DBCS字符串常量不能在第二行继续。
定界符
在C程序中使用关键字 EXEC SQL 和分号(;)来定义SQL语句。
声明表和视图
您的C程序应该使用DECLARE TABLE语句来描述每个表并查看程序访问。 您可以使用 Db2 声明生成器(DCLGEN)生成DECLARE TABLE语句。 更多信息,请参阅 DCLGEN(声明生成器 )。
Db2 预编译器处理的源代码中包含SQL语句和变量声明
若要包含来自分区数据集成员的 SQL 语句或 C 主机变量声明,请将以下 SQL 语句添加到要包含语句的源代码中:
EXEC SQL INCLUDE member-name;

您不能嵌套SQL INCLUDE语句。 不要使用C #include 语句来包含SQL语句或C主机变量声明。

页边距
在1-72列中编写SQL代码,除非您向 Db2 预编译器指定了其他边距。 如果EXEC SQL不在指定的范围内, Db2 预编译器将无法识别SQL语句。 Db2 协处理器不受页边距规则限制。 Db2 协处理器允许可变长度的源输入。
名称
您可以使用任何有效的 C 名称作为主机变量,但必须遵守以下限制:
  • 请勿使用双字节字符。
  • 不要使用以“DSN”开头的外部输入名称或访问计划名称,也不要使用以“SQL”开头的宿主变量名称或宏名称(大写或小写字母的任意组合)。 这些名字是 Db2 的保留名称。

更改开始以井号('#')开头的SQL标识符可以被解释为C宏语句。更改结束

空值和NUL
C和SQL在 null一词的使用上有所不同。 C语言中有一个空字符(NUL)、一个空指针(NULL)和一个空语句(只是一个分号)。 C NUL是一个与0等价的单个字符。 C NULL是一个特殊的保留指针值,它不指向任何有效的数据对象。 SQL空值是一个特殊值,与所有非空值不同,表示没有(非空)值。 NUL(或NUL终止符)是C和C++中的空字符,而NULL是SQL中的空值。
序号
Db2 预编译器生成的语句不带序号。 ( Db2 协处理器不执行此操作,因为源代码由编译器读取和修改。)
声明标签
您可以在SQL语句前加上标签。
三合字
C字符集中的某些字符并非在所有键盘上都有。 您可以使用一个由三个字符组成的序列(称为三字符 )将这些字符输入到C源程序中。 Db2 支持的三个字符与C编译器支持的三个字符相同。
WHENEVER 语句
SQL语句中GOTO子句的目标必须在WHENEVER语句影响的任何SQL语句的范围内。
C/C++的特殊注意事项
  • 使用 C/370 多任务处理功能,其中多个任务执行SQL语句,会导致不可预测的结果。
  • 除了 Db2 协处理器之外,在运行C预处理器之前,必须先运行 Db2 预编译器。
  • 除了 Db2 协处理器, Db2 预编译器不支持C预处理器指令。
  • 如果您使用包含C代码的条件编译器指令,请将它们放在应用程序的第一个C标记之后,或者使用 #include 预处理器指令将它们包含在C程序中。

有关C预处理器指令的更多信息,请参阅相应的C文档。

要使用十进制浮点主机数据类型,必须执行以下操作:
  • 请使用 z/OS® 1.10 或以上( z/OS V1R10 XL C/C++ )。
  • 使用C/C++编译器选项DFP进行编译。
  • 指定SQL编译器选项以启用 Db2 协处理器。
  • 指定C/C++编译器选项,ARCH(7)。 如果源代码中使用DFP类型,则DFP编译器选项要求使用此选项。
  • 指定编译器选项“DEFINE(__STDC_WANT_DEC_FP__)”。
处理 SQL 错误代码
C和C++应用程序可以从 Db2 获取有关SQL错误的更多信息。 更多信息,请参阅 《在C和C++应用程序中处理SQL错误代码 》。