DCLGEN 实用程序如何为 VARCHAR(n) 数据类型容纳 NULL 宿主变量?
db2databasebig data analytics更新于 2026/2/11 18:07:17
如果 DB2 列未使用"NOT NULL"选项明确定义,则可以存储 NULL 值。但是,COBOL 没有任何 NULL 概念。为了处理这些 NULL 值,COBOL 程序对字符列使用空格,对具有 NULL 值的整数列使用零。
然而,主要的挑战是如何检测特定列是否具有 NULL 值,以及如何将空格/零移动到相应的宿主变量中。为了解决这个问题,DCLGEN 实用程序为每个可以保存 NULL 值的 DB2 列生成一个 NULL 指示符。NULL 指示符是一个 2 字节字段,当相应列包含 NULL 值时,其值为 -1。 COBOL 中 NULL 指示符的配置为 PIC S9(4) COMP。
例如,我们有一个 DB2 列 ORDER_DESCRIPTION,其数据类型为 VARCHAR(50),并且可以保存 NULL 值。DCLGEN 生成的该列对应的主变量和 NULL 指示符如下所示−
01 ORDER-DESCRIPTION 49 ORDER-DESCRIPTION-N PIC S9(4) COMP 49 ORDER-DESCRIPTION-DATA PIC X(50)。
我们可以在 COBOL-DB2 程序中检查 ORDER_DECRIPTION 列是否为 NULL 值,如下所示。
A010-CHECK-ORDER. EXEC SQL SELECT ORDER_DESCRIPTION INTO :ORDER-DESCRIPTION-DATA :ORDERDESCRIPTION-N FROM ORDERS WHERE ORDER_ID = :ORDER-ID END-EXEC IF ORDER-DESCRIPTION-N = -1 MOVE SPACES TO ORDER-DESCRIPTION-DATA END-IF
在本例中,当 NULL 指示符的值为 -1 时,表示 ORDER_DESCRIPTION 列具有 NULL 值,并且在本例中我们已将主变量 ORDER-DESCRIPTION-DATA 中的空格移动。

