COBOL 执行SQL语句的应用程序
您可以在某些 COBOL 程序段中编写SQL语句。
下表列出了允许的区间。
| SQL 语句 | 节目部分 |
|---|---|
|
工作存储区1 或联动区 |
|
工作存储区1 或联动区 |
|
程序部门或数据部门2 |
|
数据部门或程序部门 |
|
工作-存储区 1 |
|
Procedure Division(过程部分) |
注:
|
|
您不能在 COBOL 程序的DECLARATIVES部分中放置SQL语句。
COBOL 程序中的每个SQL语句必须以EXEC SQL开头,以END-EXEC结尾。 如果您使用的是 Db2 预编译器,EXEC和SQL关键字必须出现在同一行,但语句的其余部分可以出现在后续行中。 如果您使用的是 Db2 协处理器,EXEC和SQL关键字可以位于不同的行上。 除 COBOL 注释(包括调试行)外,请勿在EXEC和SQL两个关键字之间插入任何标记。 不要在关键字EXEC和SQL之间包含SQL注释。
若SQL语句位于两个 COBOL 语句之间,则END-EXEC后的句点可选,且可能不适用。 如果语句出现在IF……然后设置 COBOL 语句集,省略结尾句号以避免无意中结束IF语句。
EXEC SQL
UPDATE DSN8C10.DEPT
SET MGRNO = :MGR-NUM
WHERE DEPTNO = :INT-DEPT
END-EXEC.- 注释
- 在SQL语句中,凡是可使用空格的位置,均可插入 COBOL 注释行(第7列中的*)。
此外,您可以在任何嵌入的 SQL 语句中包含 SQL 注释('--')。 在评论开头的两个连字符('--')之前必须有一个空格。 更多信息,请参阅 SQL注释。
限制 :如果您正在使用 Db2 预编译器,请注意以下限制:- 在EXEC和SQL关键字之间不能包含 COBOL 注释行。 预编译器将 COBOL 调试行和换页行(第7列中的/)视为注释行。 协处理器 Db2 根据 COBOL 规则处理调试行,这些规则取决于WITH DEBUGGING模式的设置。
- 您无法使用由浮动注释指示符(*>)标识的 COBOL 内联注释。 COBOL 内联注释仅在使用协处理器时才能正确解释 Db2 。
对于SQL INCLUDE语句, Db2 预编译器将END-EXEC后的句点后的任何文本以及与END-EXEC在同一行的文本视为注释。 协处理器 Db2 将此文本视为 COBOL 程序语法的一部分。
- 调试行
- Db2 预编译器忽略调试行第7列中的“D”,将其视为空白。 协处理器 Db2 遵循 COBOL 语言关于调试行的规则。
- SQL语句的继续
- 在 COBOL 程序中嵌入的SQL语句里,字符串常量跨行延续的规则与 COBOL 中非数字字面量的延续规则相同。 但是,在续行区域的B区,您可以使用引号或撇号作为第一个非空白字符。 该规则同样适用于分隔符的延续,且不受字符串分隔符选项的影响。
为了符合SQL标准,用单引号分隔字符串常量,并在字符串常量的续行B区使用引号作为第一个非空白字符。
使用 Db2 预编译器时,SQL语句的连续行可以出现在第8-72列,使用 Db2 协处理器时,则出现在第12-72列。
- 定界符
- 在 COBOL 程序中,使用关键字
EXEC SQLbegin和end来限定END-EXECSQL语句,如下面的示例代码所示:EXEC SQL SQL-statement END-EXEC. - COPY
- 若使用预 Db2 编译器,请勿在主机变量声明中使用 COBOL 的COPY语句。 若使用协处理器 Db2 ,可使用 COBOL COPY指令。
- REPLACE
- 如果您使用 Db2 预编译器,REPLACE语句对SQL语句没有影响。 它仅影响预编译器生成的 COBOL 语句。
若使用协处理器 Db2 ,REPLACE语句将同时替换SQL语句中的文本字符串以及生成的 COBOL 语句中的文本字符串。
- 声明表和视图
- 您的 COBOL 程序应包含DECLARE TABLE语句,用于描述程序访问的每个表和视图。 您可以使用 Db2 声明生成器(DCLGEN)生成DECLARE TABLE语句。 您应该将DCLGEN成员纳入数据部门。
- COBOL 程序中的动态SQL
- 通常, COBOL 程序能够轻松处理动态SQL语句。 COBOL 程序能够处理SELECT语句,前提是返回的数据类型和字段数量是固定的。 如果您想使用变量列表SELECT语句,请使用SQLDA。
- 包括代码
- 要在源代码中包含来自分区数据集成员的SQL语句或 COBOL 主机变量声明,请在需要包含这些语句的位置使用以下SQL语句:
EXEC SQL INCLUDE member-name END-EXEC.如果您使用的是 Db2 预编译器,则无法嵌套SQL INCLUDE语句。 在此情况下,请勿使用 COBOL 动词包含SQL语句或主机变量声明,也请勿使用SQL INCLUDE语句包含 CICS® 预处理器相关代码。 一般来说,如果您使用的是 Db2 预编译器,则仅将SQL INCLUDE语句用于SQL相关的编码。 若您使用的是 COBOLDb2 协处理器,则上述所有限制均不适用。
使用“EXEC SQL”和“END-EXEC”关键字对仅包含SQL语句。 COBOL 不允许使用诸如COPY或REPLACE之类的语句。
- 页边距
- 您必须在第12-72列中编写以EXEC SQL开头的SQL语句。 否则, Db2 预编译器将无法识别SQL语句。
- 名称
- 您可以使用任何有效的 COBOL 名称作为主机变量。 不要使用以“DSN”开头的外部输入名称或访问计划名称,也不要使用以“SQL”开头的宿主变量名称。 这些名字是 Db2 的保留名称。
- 序号
- Db2 预编译器生成的源语句不包含序列号。
- 声明标签
- 在程序部分,您可以使用段名称来定义可执行的SQL语句。
- WHENEVER 语句
- SQL语句中GOTO子句的目标WHENEVER必须是PROCEDURE DIVISION中的节名称或非限定段落名称。
- COBOL 的特殊注意事项
- 以下注意事项适用于使用 COBOL 编写的程序:
- 在使用多级结构中的元素作为主机变量名的 COBOL 程序中,预 Db2 编译器会生成最低的两级名称。
- 使用 COBOL 编译器的DYNAM和NODYNAM选项取决于操作环境。TSO 和 IMS : 在编译 COBOL 程序时,可参照以下指南指定 DYNAM 选项。 IMS 并 Db2 共享一个通用的别名名称 DSNHLI,用于语言接口模块。 当您连接您的图书馆时,必须执行以下操作:
- 若使用 IMS 并启用 COBOL 的 DYNAM 选项,请务必先连接 IMS 库文件。
- 如果您仅在 环境下运行应用程序,请务必先连接 Db2 库。
CICS CAF、RRSAF: 在编译 COBOL 程序时,若该程序包含 CICS 语句,或由独立的 CICS 编译器或集成式 CICS 编译器进行翻译,则必须指定NODYNAM选项。 在这种情况下,您不能指定DYNAM选项。 如果您的 CICS 程序包含一个子程序,该子程序既未由独立的 CICS 编译器编译,也未由集成的 CICS 编译器处理,但其中包含SQL语句,则可指定DYNAM选项。 然而,在此情况下,您必须在 Db2 库之前连接 CICS 库。
您可以使用 DYNAM 选项或 NODYNAM 选项来编译 COBOL 存储过程。 如果您使用DYNAM,请通过执行以下操作之一,确保动态加载正确的 Db2 语言界面模块:
- 使用预编译选项ATTACH(RRSAF)。
- 将DSNRLI模块复制到加载库中,并连接到 Db2 库的前面。 请使用会员名DSNHLI。
- 为避免截断数值,请使用以下任一方法:
- 对于二进制整数宿主变量,请使用 COMP-5 数据类型。
- 指定 COBOL 编译器选项:
TRUNC(OPT)或TRUNC(STD),前提是您确定应用程序移动到每个二进制变量的数据精度不会超过二进制变量PICTURE子句中定义的精度。
- TRUNC(BIN) 如果移动到每个二进制变量的数据的精度可能超过PICTURE子句中的值。
Db2 将值赋给二进制整型主机变量,如同指定了 COBOL 编译器选项TRUNC(BIN)或使用了 COMP-5 数据类型。
- 若您使用的是 Db2 预编译器,且您的 COBOL 程序包含多个入口点或被多次调用,则在首个SQL语句执行之前执行的entry语句的USING子句中,必须包含SQLCA以及所有作为主机变量被任何SQL语句使用的链接区条目。
- 如果您使用 Db2 预编译器,则PROCEDURE DIVISION和DECLARATIVES语句之间不应出现任何编译器指令。
- 请勿在SQL语句中使用 COBOL 的比喻常量(如ZERO和SPACE)、符号字符、引用修改以及下标。
- 请遵守SQL标识符命名规则,如 《SQL中的标识符》 所述。 然而,仅限于 COBOL ,SQL标识符的命名可遵循 COBOL 单字节字符的命名规则,具体详见 COBOL 单字节字符的命名规则( COBOL )。 但是,名称不能超过 Db2 对象的允许长度。
- 环绕连字符用作减法运算符,中间带有空格。 Db2 通常将连字符周围没有空格的部分解释为主变量名的一部分。
- 若在 COBOL
PERFORM … THRU段落中包含SQL语句并同时指定该SQL语句WHENEVER … GO, COBOL 编译器将返回警告信息 IGYOP3094。 这条消息可能表明有问题。 不建议使用此用法。 - 如果您正在使用 Db2 预编译器,在使用嵌套程序或批处理编译时,所有SQL语句及其引用的任何主机变量都必须位于第一个程序中。
- 若使用预 Db2 编译器,您的 COBOL 程序必须包含DATA DIVISION和PROCEDURE DIVISION。 在包含 SQL 语句的程序中,必须同时包含“部门”和“工作-存储”部分。 然而,如果您的 COBOL 程序需要LOCAL-STORAGE SECTION,则应使用协处理器 Db2 而非预 Db2 编译器。
预 Db2 编译器生成此 COBOL 变量:
协处理器 Db2 生成此 COBOL 变量:DSN-TMP2 PIC S9(18) COMP-3
若指定 COBOL 选项RULES(NOEVENPACK), COBOL 编译器将生成警告 IGYDS1348-W ,因为这些变量的紧凑十进制位数为偶数。SQL---SCRVALD DS 10P PIC S9(18) COMP-3
如果您的程序使用 Db2 预编译器,并且使用在LINKAGE SECTION中定义的参数作为 Db2 的主变量,并且输入参数的地址可能会在后续调用您的程序时发生变化,则您的程序必须重置变量SQL-INIT-FLAG。 该标志由 Db2 预编译器生成。 重置该标志表示在执行下一个 SQL 语句时必须初始化存储。 要重置标志,请在被调用程序的PROCEDURE DIVISION中,在任何使用主机变量的可执行SQL语句之前插入语句MOVE ZERO TO SQL-INIT-FLAG。 若使用 COBOLDb2 协处理器,被调用程序无需重置SQL-INIT-FLAG标志。
- 处理 SQL 错误代码
- Cobol应用程序可以从 Db2 获取有关SQL错误的更多信息。 更多信息,请参阅 《处理Cobol应用程序中的SQL错误代码 》。