DCLGEN 实用程序如何为 VARCHAR(n) 数据类型提供 NULL 主变量?
如果DB2列没有明确定义为'NOTNULL'选项,则该列可以存储NULL值。但是,COBOL没有任何NULL概念。为了处理这些NULL值,COBOL程序对字符列使用空格,对具有NULL值的整数列使用零。
但是,主要挑战是如何检测特定列是否具有NULL值以及如何将空格/零移动到相应的主变量中。为了克服这个问题,DCLGEN实用程序为每个可以包含空值的DB2列生成一个NULL指示符。NULL指示符是一个2字节的字段,当相应的列中有NULL值时,该值取为-1。COBOL中NULL指示符的配置是PICS9(4)COMP。
例如,我们有一个数据类型为VARCHAR(50)的DB2列ORDER_DESCRIPTION,它可以保存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中的空格。