📜  JCL-定义数据集

📅  最后修改于: 2020-11-22 17:06:15             🧑  作者: Mango


数据集名称指定文件的名称,并在JCL中用DSN表示。 DSN参数是指新创建或现有数据集的物理数据集名称。 DSN值可以由子名称组成,每个子名称的长度为1到8个字符,由句点分隔,并且总长度为44个字符(字母数字)。以下是语法:

DSN=&name | *.stepname.ddname

临时数据集仅需要存储作业持续时间,并在作业完成时删除。此类数据集表示为DSN =&name或仅未指定DSN。

如果要在下一个作业步骤中使用由作业步骤创建的临时数据集,则将其引用为DSN = *。stepname.ddname 。这称为向后引用。

串联数据集

如果有多个相同格式的数据集,则可以将它们串联起来并作为输入以单个DD名称的形式传递给程序。

//CONCATEX JOB CLASS=6,NOTIFY=&SYSUID
//*
//STEP10    EXEC PGM=SORT
//SORTIN    DD DSN=SAMPLE.INPUT1,DISP=SHR
//          DD DSN=SAMPLE.INPUT2,DISP=SHR
//          DD DSN=SAMPLE.INPUT3,DISP=SHR
//SORTOUT   DD DSN=SAMPLE.OUTPUT,DISP=(,CATLG,DELETE),
//          LRECL=50,RECFM=FB

在上面的示例中,三个数据集被串联并以输入形式传递给SORTIN DD名称中的SORT程序。合并文件,对指定的键字段进行排序,然后以SORTOUT DD名称将其写入单个输出文件SAMPLE.OUTPUT。

覆盖数据集

在标准化的JCL中,将要执行的程序及其相关的数据集放置在分类过程中,该过程在JCL中称为。通常,出于测试目的或用于事件修复,可能需要使用除编目过程中指定的数据集以外的其他数据集。在这种情况下,可以在JCL中覆盖过程中的数据集。

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//JSTEP1    EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
//          DATAC=MYDATA.BASE.LIB1(DATA1)
//STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR
//*
//* The cataloged procedure is as below:
//*
//CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1
//*
//STEP1     EXEC PGM=&PROG
//STEPLIB   DD DSN=&BASELB,DISP=SHR
//IN1       DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1      DD SYSOUT=*
//SYSOUT    DD SYSOUT=*
//SYSIN     DD MYDATA.BASE.LIB1(DATA1),DISP=SHR
//*
//STEP2     EXEC PGM=SORT

在上面的示例中,数据集IN1使用PROC中的文件MYDATA.URMI.INPUT,该文件在JCL中被覆盖。因此,执行中使用的输入文件为MYDATA.OVER.INPUT。请注意,该数据集被称为STEP1.IN1。如果JCL / PROC中只有一个步骤,则可以仅使用DD名称来引用数据集。同样,如果JCL中有多个步骤,则该数据集将被覆盖为JSTEP1.STEP1.IN1。

//SAMPINST  JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//STEP      EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
//          DATAC=MYDATA.BASE.LIB1(DATA1)
//STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR
//          DD DUMMY
//          DD DUMMY
//*

在上面的示例中,在IN1串联的三个数据集中,第一个数据集在JCL中被覆盖,其余数据集保持与PROC中的数据集相同。

在JCL中定义GDG

生成数据组(GDG)是通过通用名称彼此相关的一组数据集。通用名称称为GDG基础,与该基础关联的每个数据集均称为GDG版本。

例如,MYDATA.URMI.SAMPLE.GDG是GDG的基本名称。数据集分别命名为MYDATA.URMI.SAMPLE.GDG.G0001V00,MYDATA.URMI.SAMPLE.GDG.G0002V00等。 GDG的最新版本称为MYDATA.URMI.SAMPLE.GDG(0),早期版本称为(-1),(-2),依此类推。在程序中要创建的下一个版本在JCL中称为MYDATA.URMI.SAMPLE.GDG(+1)。

在JCL中创建/更改GDG

GDG版本可以具有相同或不同的DCB参数。可以将初始模型DCB定义为可用于所有版本,但是在创建新版本时可以将其覆盖。

//GDGSTEP1 EXEC PGM=IDCAMS
//SYSPRINT DD  SYSOUT=*
//SYSIN    DD  *
           DEFINE GDG(NAME(MYDATA.URMI.SAMPLE.GDG)   -
           LIMIT(7)                           -
           NOEMPTY                            -
           SCRATCH)
/*
//GDGSTEP2 EXEC PGM=IEFBR14
//GDGMODLD DD  DSN=MYDATA.URMI.SAMPLE.GDG,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL,10,20),
//         DCB=(LRECL=50,RECFM=FB)
//

在上面的示例中,IDCAMS实用程序使用在SYSIN DD语句中传递的以下参数在GDGSTEP1中定义了GDG基础:

  • NAME指定GDG基础的物理数据集名称。

  • LIMIT指定GDG基本版本可以容纳的最大版本数。

  • 达到LIMIT时, EMPTY取消所有世代的目录。

  • NOEMPTY取消了最近最少一代的目录。

  • 未生成时, SCRATCH会物理删除该生成。

  • NOSCRATCH不会删除数据集,即可以使用UNIT和VOL参数来引用它。

在GDGSTEP2中,IEFBR14实用程序指定所有版本都将使用的模型DD参数。

IDCAMS可用于更改GDG的定义参数,例如增加LIMIT,将EMPTY更改为NOEMPTY等,并且其与SYSIN命令相关的版本是ALTER MYDATA.URMI.SAMPLE.GDG LIMIT(15)EMPTY

在JCL中删除GDG

使用IEFBR14实用程序,我们可以删除GDG的单个版本。

//GDGSTEP3   EXEC PGM=IEFBR14
//GDGDEL     DD  DSN=MYDATA.URMI.SAMPLE.GDG(0),
//           DISP=(OLD,DELETE,DELETE)

在上面的示例中,删除了MYDATA.URMI.SAMPLE.GDG的最新版本。请注意,正常作业完成时的DISP参数编码为DELETE。因此,当作业完成执行时,将删除数据集。

可以使用SYSIN命令DELETE(MYDATA.URMI.SAMPLE.GDG)GDG FORCE / PURGE删除IDCAMS,以删除GDG及其相关版本。

  • FORCE删除GDG版本和GDG基础。如果任何GDG版本设置的到期日期都尚未到期,则不会删除这些版本,因此保留了GDG基础。

  • 无论到期日期如何, PURGE都会删除GDG版本和GDG基本信息。

在JCL中使用GDG

在以下示例中,将最新版本的MYDATA.URMI.SAMPLE.GDG用作程序的输入,并将创建新版本的MYDATA.URMI.SAMPLE.GDG作为输出。

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01   EXEC PGM=MYCOBB
//IN1     DD DSN=MYDATA.URMI.SAMPLE.GDG(0),DISP=SHR
//OUT1    DD DSN=MYDATA.URMI.SAMPLE.GDG(+1),DISP=(,CALTG,DELETE)
//        LRECL=100,RECFM=FB

在这里,如果使用实际名称(如MYDATA.URMI.SAMPLE.GDG.G0001V00)引用了GDG,则它将导致每次执行前都要更改JCL。使用(0)和(+1)可以动态替换GDG版本来执行。