JCL:IF语句和SET语句

时间:2018-09-24 15:02:16

标签: mainframe jcl

我已将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条件之前)。

请帮助我理解。

谢谢! 巴拉提

2 个答案:

答案 0 :(得分:4)

@hogstrom说的是正确的。 JCL IF语句测试Step Return codes,而不测试变量值

//IFBAD     IF  (ABEND | STEP1.RC > 8) THEN

根据他所说的,您可以在include语句中使用变量

包含变量

//  INCLUDE MEMBER=OPT&FLAG

和proclib中的设置成员

MEMBER = OPT1

  // SET ARG=DEV 

MEMBER = OPT2

  // 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