我已将FLAG设置为1,并且我正在执行ARG值应仅为DEV。但是我得到的是ARG = DEV + CLIENTID
000023 // FLAG=1
000026 // IF (&FLAG=1) THEN
000027 //SET1 SET ARG=DEV
000028 // ELSE
000029 //SET2 SET ARG=DEV+&CLIENT
000030 // ENDIF
这意味着JCL在RUNTIME中分配值(在检查IF条件之前)。
请帮助我理解。
谢谢! 巴拉提
答案 0 :(得分:4)
@hogstrom说的是正确的。 JCL IF语句测试Step Return codes
,而不测试变量值:
//IFBAD IF (ABEND | STEP1.RC > 8) THEN
根据他所说的,您可以在include
语句中使用变量
// INCLUDE MEMBER=OPT&FLAG
和proclib中的设置成员
// SET ARG=DEV
// SET ARG=DEV+&CLIENT
您必须为&FLAG 的每个可能值设置一个包含项,并且对于一个SET
来说,它的作用很长。当您可以设置很多变量,例如
// INCLUDE MEMBER=ENV&ENV
其中&ENV = PROD
\ TEST
等
不使用标志,只需设置变量:
// SET ARG=DEV
或
// SET ARG=DEV+&CLIENT
答案 1 :(得分:3)
JCL Manual中有一些很好的信息,可以理解IF / THEN / ELSE的目的。
以下是手册中的一些项目符号:
- IF / THEN / ELSE / ENDIF语句构造没有条件地控制JCL的处理;而是有条件地控制
执行工作步骤。- 一旦确定,处理IF / THEN / ELSE / ENDIF语句构造的结果将保持不变,无论来自 运行作业中剩余的所有步骤。系统不重新检查 任何后续工作步骤终止时的原始状态,或者 正常或异常。参见示例9。
- 如果关系表达式的执行时间评估确定,系统会将定义的所有DD语句分配给一个步骤
要执行的步骤。 DD语句上定义的所有数据集 作业中的作业必须在选择作业时可用 执行。- 您最多可以嵌套IF / THEN / ELSE / ENDIF语句构造,最多15个级别。您可以在 IF / THEN / ELSE / ENDIF语句提供了以下条件之一: 支持的关系表达式关键字。任何其他符号 即使系统接受了参数,也不是预期的或 支持。
您的工作似乎合乎逻辑,但并非JCL SET和条件逻辑的预期目的。
对于您来说,最后执行的SET是使用的内容以及为什么看到DEV + CLIENTID