在 JCL 中对 JOB 和 EXEC 使用 COND
Posted
技术标签:
【中文标题】在 JCL 中对 JOB 和 EXEC 使用 COND【英文标题】:Using COND in JCL on both JOB and EXEC 【发布时间】:2020-08-23 04:08:27 【问题描述】:我正在尝试在 JCL 中的 JOB
步骤和 EXEC
步骤中使用 COND
语句。我的目标如下:
大多数情况下,所有步骤都会以零完成,因此这是一种不寻常的超车路径。我不想在每个 EXEC
步骤上编码 COND
以涵盖正常的零情况。
我曾希望以下内容能做到这一点,但我认为JOB
步骤上的COND
的优先级似乎超过了EXEC
步骤上的COND
。
//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,COND=(0,NE,STEP1)
//STEP3 EXEC PGM=MYPGM3,COND=(8,NE,STEP2)
//STEP4 EXEC PGM=MYPGM4,COND=(0,NE,STEP3)
//
【问题讨论】:
你的目标是什么?一遇到麻烦就放弃工作?第 3 步是否必须获得 RC 8,或者 8 或更少可以吗? @KevinMcKenzie - 完全正确 - 当步骤的 RC 非零时停止作业,除了预期以特定 RC 结束的偶尔步骤。我会更新问题以说明这一点。在我的例子中,STEP3 必须是 RC=8。 【参考方案1】:根据 JCL 语言参考手册,系统首先检查作业卡上指定的条件。如果满足,则作业终止,否则它会检查步骤上的条件代码。
FWIW 我总是看到步骤条件代码而不是 JOB 条件代码。
【讨论】:
是的,我以前从未见过 JOB COND。我开始明白为什么——它似乎不是很有用,因为它似乎超越了 STEP COND,而实际上它应该是相反的。【参考方案2】:按照您的点点标准,您的选择是编写基于步骤的 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 设置为 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 设置为 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 设置为 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
希望这在某种程度上有所帮助。
【讨论】:
【参考方案3】:您是在询问是否有任何方法来满足您的需求。这是一个使用流内过程的方法:
//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
//*
instream prodecure 在 EXEC 上具有 COND=(0,NE),因此这适用于执行该过程的任何步骤。使用 $COND 过程参数,您可以根据需要覆盖任何步骤。请注意,实际步骤现在是过程步骤,因此 COND= 需要您指定步骤(此处为“STEPnn”)和过程步骤(在此示例中始终为“PS”)。
【讨论】:
好主意 - 一种简写的方式来编写普通的代码:-) @MoragHughson - 您能否将您认为解决问题的答案标记为已接受。以上是关于在 JCL 中对 JOB 和 EXEC 使用 COND的主要内容,如果未能解决你的问题,请参考以下文章
zosftplib submit_wait_job(jcl) 函数不接收 JES 输出
Hive插入数据拒绝连接:ERROR exec.Task: Job Submission failed ... From master/192.168.70.128 to master:8032(代码