JCL - 定义数据集

数据集名称指定文件的名称,它在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基地可以容纳的离子.

  • EMPTY 在达到LIMIT时取消所有代的编目.

  • 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.因此,当作业完成执行时,将删除数据集.

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

  • 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

这里,如果GDG被实际名称引用像MYDATA.URMI.SAMPLE.GDG.G0001V00一样,它会导致每次执行前更改JCL.使用(0)和(+1)使其动态地替代GDG版本执行.