如何通过JCL获取除最新(0)代外的所有GDG世代文件
问题结论
JCL原生支持直接拉取GDG除最新世代外的所有历史世代,不需要额外执行复制最新世代、从GDG基目录移除最新世代的前置操作,这类修改GDG结构的操作属于冗余步骤,还存在意外损坏GDG索引的风险,完全没有必要。
实现原理
GDG(世代数据组)支持相对编号引用和范围引用规则,不需要硬编码具体的GxxxxVyy世代号,系统会自动根据当前GDG的实际世代状态匹配对应文件:
GDG基名(0):永远指向当前最新世代GDG基名(-n):指向最新世代往前数第n个世代- 范围引用语法为
GDG基名(起始相对位置,结束相对位置),省略起始位置时默认从GDG下现存最早的世代开始匹配,省略结束位置时默认匹配到最新世代。
要实现自动拉取所有非最新世代的需求,只需要引用范围到最新世代的前一个世代即可,也就是将结束相对位置设为-1,省略起始位置,系统会自动拉取从最早现存世代到-1世代的所有文件,自动适配GDG的世代总数变化:
- 当GDG共3个世代时,自动匹配G0001V00、G0002V00两个历史世代
- 当GDG共4个世代时,自动匹配前3个历史世代
- 无论GDG后续增加多少世代,都不需要修改JCL代码
实现示例
以下JCL片段可以直接实现需求,作业运行时不会修改原GDG的任何结构和内容:
//PULLHIST EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //* 直接引用所有非最新世代,自动适配世代总数 //SYSUT1 DD DSN=A.GDG.FILE(,-1),DISP=SHR //SYSUT2 DD DSN=YOUR.TARGET.OUTPUT, // DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(20,10),RLSE), // DCB=*.SYSUT1 //SYSIN DD DUMMY
注意事项
- 上述引用方式默认按从旧到新的顺序串联所有匹配的世代文件,和直接引用GDG基名(不带括号,读取所有世代含最新)的顺序一致
- 如果业务场景中存在GDG仅存1个世代(无历史世代)的情况,上述写法会触发JCL数据集不存在错误,需要提前通过IDCAMS查询GDG状态做分支判断
- 不要为了实现该需求修改GDG的LIMIT参数、删除或移动最新世代,会破坏GDG的世代顺序逻辑
内容的提问来源于stack exchange,提问作者Zachary Hardin
相关产品推荐
相关产品推荐

