- JCL 教程
- JCL 首页
- JCL - 概述
- JCL - 环境
- JCL - JOB 语句
- JCL - EXEC 语句
- JCL - DD 语句
- JCL - 基本库
- JCL - 过程
- JCL - 条件处理
- JCL - 定义数据集
- JCL - 输入/输出方法
- JCL - 运行 COBOL 程序
- JCL - 实用程序
- JCL - 基本排序技巧
- JCL 有用资源
- JCL - 问题与解答
- JCL - 快速指南
- JCL - 有用资源
- JCL - 讨论
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 程序。这些文件被合并,根据指定的键字段排序,然后写入 SORTIN 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 可用于删除 GDG 及其相关版本,使用 SYSIN 命令 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 版本。
