PL/I 自变量值
在 PL/I 中,参数可以是正确数据类型的任何 PL/I 数据引用,前提是引用已连接的存储器。 此外, data-value, pointer-value或发送方 CVDA 可以是可以转换为所需类型的任何 PL/I 表达式,包括包含内置函数 (例如 ADDR 或 LENGTH) 的表达式。
下表显示了如何定义正确的数据类型:
| 数据类型 | PL/I 定义 |
|---|---|
| 半字二进制 | 固定货柜 (15) |
| 全字二进制 (包括 CVDA) | 固定货柜 (31) |
| 双字二进制 | 固定货柜 (63) |
| Pointer | POINTER |
| 字符串 (长度为n 个字符) | CHAR (n) |
| UTF-8 字符串 (长度为n 字节) | CHAR (n) |
| 压缩十进制 (n 个十进制数字) | FIXED DEC (n, 0) |
PL/I 要求在 CALL 语句中传递的变量的数据类型,精度,长度和对齐属性与被调用过程的 ENTRY 语句上相应自变量的数据类型,精度,长度和对齐属性相匹配。 如果属性不匹配,那么 PL/I 编译器会将哑元变量替换为 CALL 语句中指定的变量。
转换程序在将 CICS 命令转换为 PL/I CALL 语句时生成 ENTRY 语句,如果自变量的 ENTRY 语句规范与您指定的变量不匹配,那么 CICS 会获取哑元变量而不是您的哑元变量。 尽管编译器在进行此类替换时发出警告消息,但很容易错过该消息,执行结果几乎从未有过预期。 即使编译器实现特定属性值的方式没有差别,也会发生此情况。
转换程序生成的 ENTRY 语句使用上表中显示的值指定数据类型,精度和长度。 因此,要防止编译器替换哑元变量,必须为 CICS 命令中使用的变量显式指定这些属性,除非它们正好与缺省值匹配。 (如果使用了 DEFAULT 语句,那么缺省值来自该语句,否则来自编译器缺省值。)
相反,生成的 ENTRY 语句 不 指定对齐属性,因此将应用缺省值。 这意味着仅当自变量具有缺省对齐时,才会发生 CICS 选项中的自变量与 ENTRY 语句之间的对齐协议,如果不覆盖 PL/I 缺省值,那么会自动执行此操作。
安装时的缺省值可以更改,因此,最安全的策略是显式指定 CICS 命令中使用的变量的数据类型,长度和精度,并省略对齐规范。
如果使用变长字符串,需要注意 PL/I 的另一个方面。 定义为具有双字节长度字段的 VARYING 的 PL/I 前缀字符串。 如果将此类字符串命名为数据值,那么 CICS 接收的数据将以此长度前缀开头-通常是意外结果。 (发送到 CICS 的长度是您在关联的长度选项中指定的任何长度,或者如果省略该长度,那么是字符串的最大长度加上长度前缀的两个长度。) 同样,如果将该字符串命名为 数据区,那么 CICS 将存储从长度前缀开始请求的信息。 CICS 不会以长度作为字符数据的前缀,因此此结果通常也是意外结果。