问题描述
我试图在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”)。