在JOB和EXEC上的JCL中使用COND

问题描述

我试图在COND步骤和JOB步骤上使用JCL中的EXEC语句。我的目标如下:

  • 所有步骤必须以零返回码完成
  • 除非明确指出要执行特定步骤
  • 当步骤完成并返回意外代码时,作业应停止

通常,所有步骤都将以零完成,因此拥有超驰是不寻常的途径。我不想在每个COND步骤上都编码EXEC来覆盖正常的零值情况。

我希望下面的方法可以做到这一点,但是我认为COND步骤中JOB的优先级似乎在COND步骤中优先于EXEC

//MYJOB   JOB,COND=(0,NE)
//JOBLIB  DD   DSN=...
//        DD   DSN=...
//STEP1   EXEC pgm=MYpgm1
//STEP2   EXEC pgm=MYpgm2
//STEP3   EXEC pgm=MYpgm3,COND=(8,NE,STEP2)
//STEP4   EXEC pgm=MYpgm4
//

是否可以任何方式进行编码,而无需执行以下操作:

//MYJOB   JOB 
//JOBLIB  DD   DSN=...
//        DD   DSN=...
//STEP1   EXEC pgm=MYpgm1
//STEP2   EXEC pgm=MYpgm2,STEP1)
//STEP3   EXEC pgm=MYpgm3,STEP2)
//STEP4   EXEC pgm=MYpgm4,STEP3)
//

解决方法

根据《 JCL语言参考》手册,系统首先检查作业卡上指定的条件。如果满足,作业将终止,否则它将检查步骤中的cond代码。

FWIW我一直看到步进条件代码,而不是JOB条件代码。

,

按照点指示的标准,您的选择是对基于步骤的COND(已识别)进行编码,或者在要防止的步骤块周围使用IF ... THEN ... ELSE ... ENDIF语句根据返回码运行。 IF比COND更 更容易编写和读取。

例如,此作业使用IDCAMS通过SET LASTCC命令强制返回代码。下划线是一个最大为16的整数,更高的整数将仅产生16。

我将步骤包装在2个IF ... ENDIF块中。有关触发每个结果的RC的输出,请参见下文。

Command ===>                                                          Scroll ===> CSR
000001 //MYJOB    JOB (AA-1234),MYJOB,CLASS=P,MSGCLASS=X,REGION=0M,000002 // NOTIFY=&SYSUID 
000003 //* 
000004 //STEP1    EXEC PGM=IDCAMS 
000005 //SYSPRINT DD   SYSOUT=* 
000006 //SYSIN    DD   * 
000007  SET LASTCC=_ 
000008 /* 
000009 //IF1      IF   RC EQ 0 THEN 
000010 //STEP2    EXEC PGM=IDCAMS 
000011 //SYSPRINT DD   SYSOUT=* 
000012 //SYSIN    DD   * 
000013  SET LASTCC=_ 
000014 /* 
000015 //IF2      IF   STEP2.RC LT 8 THEN 
000016 //STEP3    EXEC PGM=IEFBR14 
000017 //STEP4    EXEC PGM=IEFBR14 
000018 //STEP5    EXEC PGM=IEFBR14 
000019 //EIF2     ENDIF 
000020 //EIF1     ENDIF 
****** ******************************** Bottom of Data ********************************

将产生以下内容:

当我将STEP1的LASTCC值设置为4并将STEP2的LASTCC值设置为 any 时:

14.03.41 JOB26149  IEF403I MYJOB - STARTED - TIME=14.03.41                                 
14.03.41 JOB26149  GSDMV20I -JOBNAME  STEPNAME PROCSTEP CCODE ELAPSED-TIME  CPU-TIME STEPNO
14.03.41 JOB26149  GSDMV21I -MYJOB             STEP1        4     00:00:00     0.02S     1 
14.03.41 JOB26149  GSDMV21I -MYJOB             STEP2    FLUSH     00:00:00     0.00S     2 
14.03.41 JOB26149  GSDMV21I -MYJOB             STEP3    FLUSH     00:00:00     0.00S     3 
14.03.41 JOB26149  GSDMV21I -MYJOB             STEP4    FLUSH     00:00:00     0.00S     4 
14.03.41 JOB26149  GSDMV21I -MYJOB             STEP5    FLUSH     00:00:00     0.00S     5 
14.03.41 JOB26149  IEF404I MYJOB - ENDED - TIME=14.03.41                                   
14.03.41 JOB26149  $HASP395 MYJOB    ENDED - RC=0004                                       

当我将STEP1的LASTCC值设置为0并将STEP2的LASTCC值设置为4时:

14.02.40 JOB26136  IEF403I MYJOB - STARTED - TIME=14.02.40                                 
14.02.40 JOB26136  GSDMV20I -JOBNAME  STEPNAME PROCSTEP CCODE ELAPSED-TIME  CPU-TIME STEPNO
14.02.40 JOB26136  GSDMV21I -MYJOB             STEP1        0     00:00:00     0.03S     1 
14.02.41 JOB26136  GSDMV21I -MYJOB             STEP2        4     00:00:00     0.02S     2 
14.02.41 JOB26136  GSDMV21I -MYJOB             STEP3        0     00:00:00     0.00S     3 
14.02.41 JOB26136  GSDMV21I -MYJOB             STEP4        0     00:00:00     0.00S     4 
14.02.41 JOB26136  GSDMV21I -MYJOB             STEP5        0     00:00:00     0.00S     5 
14.02.41 JOB26136  IEF404I MYJOB - ENDED - TIME=14.02.41                                   
14.02.41 JOB26136  $HASP395 MYJOB    ENDED - RC=0004                                       

当我将STEP1的LASTCC值设置为0并将STEP2的LASTCC值设置为8时:

13.59.41 JOB25747  IEF403I MYJOB - STARTED - TIME=13.59.41                                 
13.59.41 JOB25747  GSDMV20I -JOBNAME  STEPNAME PROCSTEP CCODE ELAPSED-TIME  CPU-TIME STEPNO
13.59.41 JOB25747  GSDMV21I -MYJOB             STEP1        0     00:00:00     0.03S     1 
13.59.41 JOB25747  GSDMV21I -MYJOB             STEP2        8     00:00:00     0.01S     2 
13.59.41 JOB25747  GSDMV21I -MYJOB             STEP3    FLUSH     00:00:00     0.00S     3 
13.59.41 JOB25747  GSDMV21I -MYJOB             STEP4    FLUSH     00:00:00     0.00S     4 
13.59.41 JOB25747  GSDMV21I -MYJOB             STEP5    FLUSH     00:00:00     0.00S     5 
13.59.41 JOB25747  IEF404I MYJOB - ENDED - TIME=13.59.41                                   
13.59.41 JOB25747  $HASP395 MYJOB    ENDED - RC=0008                                       

希望这会有所帮助。

,

您在问是否有任何方式来体现您想要的内容。这是使用插播过程的一种:

//jobname  JOB .....                                                    
//*                                                                     
//* --- Start of instream procedure ----------------------------------- 
//*                                                                     
//$EXEC   PROC $PGM=,$PARM=,$COND=(0,NE)                                
//PS      EXEC PGM=&$PGM,PARM=&$PARM,COND=(&$COND)                      
//        PEND                                                          
//*                                                                     
//* --- End of instream procedure ------------------------------------- 
//*                                                                     
//STEP01  EXEC $EXEC,$PGM=MYPGM1                                        
//* add any DD statements for MYPGM1 hereafter                          
//*                                                                     
//STEP02  EXEC $EXEC,$PGM=MYPGM2                                        
//* add any DD statements for MYPGM2 hereafter                          
//*                                                                     
//STEP03  EXEC $EXEC,$PGM=MYPGM3,$COND=(8,NE,STEP02.PS)                 
//* add any DD statements for MYPGM3 hereafter                          
//*                                                                     
//STEP04  EXEC $EXEC,$PGM=MYPGM4                                        
//* add any DD statements for MYPGM4 hereafter                          
//*                                                                     

流内程序在EXEC上具有COND =(0,NE),因此这适用于执行该过程的任何步骤。使用$ COND过程参数,您可以根据需要在任何步骤上覆盖。请注意,实际步骤现在是过程步骤,因此COND =需要您指定步骤(此处为“ STEPnn”)和过程步骤(在此示例中始终为“ PS”)。