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 实用程序在 GDGSTEP1 中定义 GDG 基础,并在 SYSIN DD 语句中传递以下参数:

  • 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 命令 DELETE(MYDATA.URMI.SAMPLE.GDG) GDG FORCE/PURGE 来删除 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

这里,如果 GDG 是通过实际名称引用的,如 MYDATA.URMI.SAMPLE.GDG.G0001V00,那么它会导致每次执行前更改 JCL。 使用(0)和(+1)使其动态替换GDG版本执行。