Jcl 简明教程
JCL - Defining Datasets
数据集名称指定文件名称,并且在 JCL 中用 DSN 表示。DSN 参数引用新创建或现有数据集的物理数据集名称。DSN 值可以由每个 1 到 8 个字符长度的不超过 44 个字符(字母数字)的子名称组成,子名称之间用点分隔。以下为语法:
DSN=&name | *.stepname.ddname
Temporary datasets 只需要在作业持续时间内存储,并在作业完成后删除。这些数据集表示为 DSN=&name ,或干脆不指定 DSN。
如果要在下一个作业步骤中使用作业步骤创建的临时数据集,则需要将其引用为 DSN= .stepname.ddname*。这称为 Backward Referencing.
Concatenating Datasets
如果有多个相同格式的数据集,则可以将它们连接起来,并以单个 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
在上面的示例中,将三个数据集串联起来,作为 SORT 程序的输入传递,在 SORTIN DD 名称中。合并文件,按指定键字段排序,然后写入 SORTOUT DD 名称中的单个输出文件 SAMPLE.OUTPUT。
Overriding Datasets
在标准化的 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 中存在的。
Defining GDGs in a JCL
生成数据组 (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)。
Create/ Alter GDG in a JCL
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 。
Delete GDG in a JCL
使用 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 基线。
Using GDG in a JCL
在以下示例中,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 版本。