代码之家  ›  专栏  ›  技术社区  ›  Morag Hughson

在JOB和EXEC上使用JCL中的COND

  •  0
  • Morag Hughson  · 技术社区  · 4 年前

    我正试着用 COND JCL关于 JOB 步骤和 EXEC 步骤。我的目标如下:

    • 所有步骤必须以零返回码完成
    • 除非明确指出特定步骤
    • 当一个步骤完成且返回的代码不符合预期时,作业应停止

    大多数情况下,所有步骤都将以零完成,因此这是一条不同寻常的路径。我不想编码 COND 在每一个 执行官 步骤涵盖正常的零情况。

    我曾希望以下内容能够做到这一点,但我认为 COND 工作 台阶似乎太高了 COND 在A 执行官 步骤。

    //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)
    //
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   NicC    4 年前

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

    FWW我总是看到步骤条件代码,而不是作业条件代码。

        2
  •  0
  •   Jonathan    4 年前

    根据你的定点标准,你的选择是编写基于步骤的COND(你已经知道了)或使用IF…然后。。。否则。。。ENDIF语句围绕您希望根据返回代码阻止运行的步骤块。IF是 许多的 虽然COND更冗长,但比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设置为 任何 :

    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
  •  0
  •   phunsoft    4 年前

    你在问是否有 任何 获得你想要的东西的方法。以下是一个使用流内程序的示例:

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