生成数据组的用例
我了解要求如下:
- 作业 A 每天运行,创建数据集 X 的新实例。
- 作业 B 定期运行,比如每月运行一次,处理自上次运行以来创建的数据集 X 的所有实例的内容。
- 在作业 B 成功运行后,您不再需要数据集 X 的各个实例。
- 您不需要按日期访问数据集 X 的单个实例(非常频繁)。
如果假设正确,则使用生成数据组可能是使用带有日期限定符的数据集名称的替代方法。
有关详细信息,请参阅 z/OS DFSMS Access Method Services Commands、z/OS MVS JCL User's Guide 和 z/OS MVS JCL Reference。
生成数据组简要说明
一个世代数据组, 短的GDG, 是一组数据集,称为生成数据集, 短的GDS, 由他们在组中的位置引用。此位置由相对位置指定,括在括号中,并在 JCL 中指定 DSN 时附加到数据集名称。 (您不能在 TSO/ISPF 中使用此表示法)。
这GDG是数据集目录中的一个特殊条目。它定义了 GDS 的基本名称、任何时候可能存在的最大代数、最老的一代会发生什么、何时达到该最大值、创建另一个新的 GDS,以及更多选项。
系统在创建和删除 GDS 时对其进行跟踪,并且此簿记是在 GDG 基本条目的帮助下完成的,并且自动附加到 DSN 的附加限定符。这个限定词的形式是 G呸呸呸V00,其中呸呸呸是实例的代号,每个新 GDS 加一。
通过指定在 GDG 基础中指定的 DSN 并将相对代号附加为正整数,在 JCL 中创建新的 GDS。作业中的第一个新 GDS 的相对位置为 +1,第二个新 GDS 在同一份工作有相对位置+2。在作业开始执行之前存在的最新 GDS 的相对位置为零 (0),之前的 GDS 的位置为 -1。
假设您定义了一个名称为Z08593.GDGTEST 的GDG。然后,您将在 JCL 中创建一个新的 GDS 实例,如下所示:
//OUTPUT DD DSN=Z08593.GDGTEST(+1),DISP=(NEW,CATLG),....
你会在整个工作中使用位置 (+1) 来引用这个实例。如果您需要阅读存在的最新实例前工作开始了,您将其称为:
//INPUT DD DSN=Z08593.GDGTEST(0),DISP=OLD,....
在同一作业中创建的第二个新实例由DSN=Z08593.GDGTEST(+2) 引用。第二个但最新的实例由DSN=Z08593.GDGTEST(-1) 引用,依此类推。默认情况下,系统会在作业开始之前拍摄现有代的“快照”,并且整个作业执行过程中的所有相关引用都保持固定在此快照上。
GDG 和 GDS 背后还有更多内容,以及如何处理它们。仔细阅读 JCL 用户指南(见上文)以更好地了解这一点,并考虑处理异常,如 ABEND、重复运行作业(因为它存在问题)等。
将所有现有世代作为一个数据集读取(串联)
这就是为什么 GDG 对您很重要的原因:您可以使用 JCL 中的单个 DD 语句轻松连接 GDG 的所有当前实例或世代。只需指定 DSN,但不要引用任何相关代:
//INPUT DD DSN=Z08593.GDGTEST,DISP=SHR
系统将在幕后为您创建 DD 连接。您甚至可以指定连接数据集的顺序:LIFO 或 FIFO:
//INPUT DD DSN=Z08593.GDGTEST,DISP=SHR,GDGORDER=FIFO
//INPUT DD DSN=Z08593.GDGTEST,DISP=SHR,GDGORDER=LIFO
LIFO 是默认值。
示例 JCL 和 JOBLOG
我希望,一个例子和由此产生的工作日志有助于理解这个想法。
创建生成数据组
这是一次性的工作。一旦创建了 GDG 条目,它将一直存在,直到被明确删除。
//jobname JOB ...
//STEP01 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE GDG ( -
NAME( Z08593.GDGTEST ) -
LIMIT( 35 ) -
NOEMPTY -
SCRATCH
)
/*
该作业定义了一个名为Z08593.GDGTEST,并指定在任何时候都不能超过 35 个生成数据集实例。它还指定在创建第 36 代时将删除最旧的一代 (SCRATCH)。 NOEMPTY 表示只删除最旧的 GDS。见访问方法服务命令手册了解详情。
可以检查生成的 GDG 条目。例如在 ISPF 3.4 中,通过在 DGD 行上输入命令 LISTC ENT(/) ALL。结果与此类似:
GDG BASE ------ Z08593.GDGTEST
IN-CAT --- CATALOG.ZOS6
HISTORY
DATASET-OWNER-----(NULL) CREATION--------2022.167
RELEASE----------------2 LAST ALTER------2022.167
ATTRIBUTES
LIMIT-----------------35 NOSCRATCH NOEMPTY LIFO NOPURGE NOEXTENDED
ASSOCIATIONS--------(NULL)
创建新一代数据集
该作业将定期运行,可能每天或每周运行,并且每次运行时都会创建一个新的 GDS 实例。
//jobname JOB ...
//STEP01 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSUT1 DD *
Record on GDG data set 01
/*
//SYSUT2 DD DSN=Z08593.GDGTEST(+1),
// DISP=(NEW,CATLG,DELETE),
// SPACE=(1,(50,50),RLSE),AVGREC=K
实际上,每次作业运行时,程序都会读取不同的输入,对其进行处理,然后将结果写入新的 GDS。出于测试目的,我使用 IEBGENER,它只是将输入 (//SYSUT1) 复制到输出 (//SYSUT2)。您可能想要编辑“记录”,例如ba 为每次运行增加数字。
在该作业第一次运行的日志中,可以看到新 GDS 的名称:
IGD101I SMS ALLOCATED TO DDNAME (SYSUT2 )
DSN (Z08593.GDGTEST.G0001V00 )
STORCLAS (ZXPS) MGMTCLAS ( ) DATACLAS (ZXPD)
VOL SER NOS= ZXPL01
在第二次运行中,它看起来像这样:
IGD101I SMS ALLOCATED TO DDNAME (SYSUT2 )
DSN (Z08593.GDGTEST.G0002V00 )
STORCLAS (ZXPS) MGMTCLAS ( ) DATACLAS (ZXPD)
VOL SER NOS= ZXPL01
等等。运行 3 次后,您将在 ISPF 3.4 中看到以下内容:
DSLIST - Data Sets Matching Z08593.GDG* Row 1 of 4
Command ===> Scroll ===> PAGE
Command - Enter "/" to select action Message Volume
-------------------------------------------------------------------------------
Z08593.GDGTEST ??????
Z08593.GDGTEST.G0001V00 ZXPL01
Z08593.GDGTEST.G0002V00 ZXPL01
Z08593.GDGTEST.G0003V00 ZXPL01
如您所见,系统为每个数据集添加了如上所述的生成限定符。笔记虽然您无法使用相对的ISPF 中的生成语法,您始终可以使用完整的数据集名称,如此处所示。如果您需要经常与 ISPF 中的人一起工作,它就不是那么有用:您不能轻易说出哪一代是在什么日期创建的。
一次处理所有现有的世代
因此,现在是时候运行该作业以处理自上次运行该作业以来已创建的所有世代。这是这项工作的 JCL:
//jobname JOB ...
//STEP01 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSUT1 DD DISP=(SHR,KEEP),
// DSN=Z08593.GDGTEST,
// GDGORDER=FIFO
//SYSUT2 DD SYSOUT=*
您指定单个 DD 语句通过其基本名称引用 GDG。系统会将其扩展为 DD 连接,每代一个 DD,在作业启动时存在。在作业日志中,您可以轻松地确认这一点:
IEF142I Z08593R STEP01 - STEP WAS EXECUTED - COND CODE 0000
IEF285I Z08593.Z08593R.JOB09672.D0000101.? SYSOUT
IGD104I Z08593.GDGTEST.G0001V00 RETAINED, DDNAME=SYSUT1
IGD104I Z08593.GDGTEST.G0002V00 RETAINED, DDNAME=
IGD104I Z08593.GDGTEST.G0003V00 RETAINED, DDNAME=
成功处理所有代后重置 GDG
一旦处理作业成功处理了所有代,您希望删除所有代以开始下一个循环。同样,一个简单的工作看起来像这样:
//jobname JOB ...
//STEP01 EXEC PGM=IEFBR14
//GDG DD DISP=(OLD,DELETE),
// DSN=Z08593.GDGTEST
作业日志的相关部分显示数据集已被删除:
IEF142I Z08593D STEP01 - STEP WAS EXECUTED - COND CODE 0000
IGD105I Z08593.GDGTEST.G0001V00 DELETED, DDNAME=SYSUT1
IGD105I Z08593.GDGTEST.G0002V00 DELETED, DDNAME=
IGD105I Z08593.GDGTEST.G0003V00 DELETED, DDNAME=
笔记重要的是要了解只有 GDS 被删除,GDG 基础是不是.