COBOL 中的主变量
在 COBOL 程序中,您可以指定数值、字符、图形、二进制、大对象、XML和ROWID主机变量。 您还可以指定结果集和表定位符以及LOB和XML文件引用变量。
- 只有部分有效的 COBOL 声明是有效的宿主变量声明。 如果变量的声明无效,任何引用该变量的 SQL 语句都可能会显示“未声明的主机变量”消息。
- 不能将定位器用作列类型。以下定位器数据类型是 COBOL 数据类型和SQL数据类型:
- 结果集定位器 (result set locator)
- 表格定位器
- LOB定位器
- LOB文件引用变量
- 一个或多个“重新定义”条目可以跟随任何77级数据描述条目。 但是,您不能在SQL语句中使用这些条目中的名称。 名称为FILLER的条目将被忽略。
- 注意溢出。 例如,假设您将一个整数列值检索到图片 S9(4 )主机变量中,而该列值大于32767或小于-32768。 根据是否指定指示变量,您会收到溢出警告或错误。
- 注意截断。 例如,如果您将一个80个字符的CHAR列值检索到PICTURE X(70)的主变量中,则检索到的字符串的最右边10个字符将被截断。 将双精度浮点或十进制列值检索到PIC S9(8 )中,COMP主机变量会移除值中的任何小数部分。 同样地,将DECIMAL数据类型的列值存入精度较低的 COBOL 十进制变量时,可能会导致数值截断。
- 如果您的长度可变的字符串宿主变量的值长度超过9999字节,请使用TRUNC(BIN)选项编译使用这些宿主变量的应用程序。 TRUNC(BIN)允许字符串的长度字段接收最多32767字节的值。
数字主变量
您可以指定以下形式的数字宿主变量:
- 浮点数
- 整数和小整数
- 十进制数
下图显示了声明浮点或实数宿主变量的语法。
下图显示了整数和小整数宿主变量的语法。
- 1 level-1 表示 COBOL 的级别在2至48的范围内。
- 2 COBOL 的二进制整数数据类型 BINARY、COMPUTATIONAL、COMP、 COMPUTATIONAL-4 和 COMP-4 是等效的。 便携式应用程序应采用二进制编码,因为COMP、 COMPUTATIONAL-4、 COMP-4、 COMPUTATIONAL-5 和 COMP-5 是 IBM 扩展,而这些扩展在国际标准化组织(ISO)/ANSI COBOL 中并不受支持。 在使用TRUNC(OPT)编译选项的应用程序中,使用 COMP-5 的声明可避免无法容纳于关联图片子句中的数据被截断。
- 3 COMPUTATIONAL-5 (以及 COMP-5 )与其他二进制整数数据类型( COBOL )等效,前提是您使用 TRUNC(BIN) 编译了其他数据类型。
- 4 任何比例规格均不予考虑。
下图显示了十进制主机变量的语法。
- 1 level-1 表示 COBOL 的级别在2至48的范围内。
- 2 与 SIGN LEADING SEPARATE 相关联的图片字符串必须具有以下形式:S9( i )V9( d )(或 S9...9V9...9 ,其中 i 和 d 个 9 实例,或 S9...9V ,其中 i 个 9 实例)。
- 3 PACKED-DECIMAL、 COMPUTATIONAL-3 和 COMP-3 是等效的。 与这些类型相关联的图片字符串必须具有以下形式:S9( i )V9( d )(或 S9...9V9...9 ,其中 i 和 d 为 9)或 S9( i )V。
在 COBOL 中,您将SMALLINT和INTEGER数据类型声明为特定的小数位数。 Db2 使用整数的完整精度(类似于使用TRUNC(BIN)编译器选项进行处理),因此可以在主机变量中存储比 COBOL 声明中指定位数允许的更大数值。 如果使用TRUNC(OPT)或TRUNC(STD)进行编译,请确保应用程序中的数字大小在声明的位数范围内。
对于可能超过9999的小整数,请使用 S9(4、 COMP-5 或使用TRUNC(BIN)进行编译。 对于可能超过999,999,999的大型整数,请使用 S9(10 ) COMP-3 获取十进制数据类型。 若使用 COBOL 处理超过 COBOL 图片数据的整数,请将该列设置为十进制类型,以确保数据类型匹配并获得良好性能。
- 如果实际数据值符合要求,则精度小于或等于18的小数变量。 如果将十进制值检索到十进制变量中,且比例小于数据库中源列的比例,则该值的分数部分可能会被截断。
- 整数或浮点变量,用于转换数值。 如果使用整数变量,则会丢失数字的小数部分。 如果十进制数可能超过整数的最大值,或者您想保留小数部分,请使用浮点变量。 浮点数是实数的近似值。 因此,当您将十进制数赋给浮点变量时,结果可能与原始数字不同。
- 字符串宿主变量。 使用CHAR函数将十进制值取回。
字符主变量
您可以指定以下字符宿主变量的形式:
- 定长字符串
- 长短不一的弦
- CLOBs
以下图表显示了CLOB以外的其他表单的语法。
下图显示了声明固定长度字符宿主变量的语法。
- 1 level-1 表示 COBOL 的级别在2至48的范围内。
- 2 与这些表单相关的图片字符串必须是 X(m) (或XX…X,其中包含 m个 X实例), m 的上限取决于 COBOL 的限制。 然而, Db2 中CHAR数据类型(固定长度字符串)的最大长度为255字节。
以下图表显示了用于声明长度可变的字符宿主变量的语法。
- 1 您不能在49级时使用中间的红字。
- 2 不能直接引用 var-1 作为主变量。
- 3 Db2 使用 S9(4 ) BINARY变量的完整长度,尽管 COBOL 配合TRUNC(STD)仅识别最高9999的数值。 此行为可能导致 COBOL 语句执行时发生数据截断错误,并可能将可变长度字符串的最大长度实际限制为9999。 请考虑使用TRUNC(BIN)编译器选项或USAGE COMP-5 来避免数据截断。
图形字符宿主变量
您可以指定以下图形主机变量形式:
- 定长字符串
- 长短不一的弦
- DBCLOBs
以下图表显示了除DBCLOB以外的其他表单的语法。
下图显示了用于声明固定长度图形主机变量的语法。
- 1 level-1 表示 COBOL 的级别在2至48的范围内。
- 2 对于固定长度的字符串, 图片字符串为 G(m) 或 N(m) (或GG... 的m个实例 )。G或NN……N),其中 m 受 COBOL 的限制。 然而,在 Db2 中,图形数据类型(固定长度的图形字符串)的最大长度为127个双字节。
- 3 仅对Unicode UTF-16 数据使用USAGE NATIONAL。 在USAGE NATIONAL的图片字符串中,必须用N代替G。USAGE NATIONAL仅由 Db2 协处理器支持。
下图显示了用于声明长度可变的图形宿主变量的语法。
- 1 不能直接引用 var-1 作为宿主变量。
- 2 即使 COBOL 配合TRUNC(STD)函数时仅识别最高 Db2 9999的数值,仍会使用 S9(4 ) BINARY变量的完整长度。 此行为可能导致 COBOL 语句执行时发生数据截断错误,并可能将可变长度字符串的最大长度实际限制为9999。 请考虑使用TRUNC(BIN)编译器选项或USAGE COMP-5 来避免数据截断。
二进制主变量
您可以指定以下二进制主机变量形式:
- 定长字符串
- 长短不一的弦
- BLOB
下图显示了声明二进制和VARBINARY主机变量的语法。
COBOL 不包含与SQL二进制类型BINARY和VARBINARY对应的变量。 要创建可与这些数据类型一起使用的宿主变量,请使用 SQL TYPE IS 子句。 SQL预编译器将此声明替换为输出源成员中的 COBOL 语言结构。
在SQL语句中引用二进制或可变二进制主机变量时,必须使用在SQL类型声明中指定的变量。 当您在主机语言语句中引用主机变量时,必须使用 Db2 生成的变量。
二进制变量声明示例
下表显示了当您声明二进制主机变量时, Db2 生成的变量示例。| 在 COBOL 程序中包含的变量声明 | Db2 在输出源代码成员中生成的对应变量 |
|---|---|
|
|
|
|
结果集定位器
下图显示了用于声明结果集定位器的语法。
表格定位器
下图显示了声明表定位器的语法。
LOB变量和文件引用变量
下图显示了声明BLOB、CLOB和DBCLOB变量以及文件引用变量的语法。
XML数据主机和文件引用变量
下图显示了用于声明BLOB、CLOB和DBCLOB主机变量以及XML数据类型的文件引用变量的语法。
ROWID 宿主变量
下图显示了声明 ROWID 主机变量的语法。
