在 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 输出

创建分区数据集的 JCL 错误

不明操作领域 JCL

如何找到 JCL MSGCLASS=?

Exec in Job and NewQuery

Hive插入数据拒绝连接:ERROR exec.Task: Job Submission failed ... From master/192.168.70.128 to master:8032(代码