我想写一些JCL来创建一个数据集,其要求是:
并且:
要么
据我所知,(1)可以用DISP = NEW来完成,(2)用DISP = OLD完成,但我无法从文档和课程材料中找出同时做两者的方法.如果数据集存在,则NEW抛出JCL错误,如果不存在,则抛出一个JD错误.我不知道怎么做(3).
我知道有很多方法可以查询JCL中是否存在数据集,但是我们还没有涵盖这一点,所以我认为没有它可能吗?
我想你正在寻找一代数据组.这不会覆盖现有数据集,但每次执行JCL时都会为您提供一个新数据集.
在前面,您必须使用此处记录的IDCAMS命令创建生成数据组基本条目.这是一次性操作.
//MAKEGDG1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE GDG (NAME(MY.DSN) LIMIT(255))
//*
Run Code Online (Sandbox Code Playgroud)
要使用它,你写JCL如......
//USEGDG1 EXEC PGM=IEFBR14
//DD001 DD DISP=(NEW,CATLG,DELETE),
// DSN=MY.DSN(+1),
// SPACE=(...),
// and so on
Run Code Online (Sandbox Code Playgroud)
......在(+1)集团内创造新一代的手段.实际创建的是具有名称的数据集MY.DSN.G####V00,其中####是系统为您管理的序列号,但您始终可以获得最新的一代MY.DSN(0).您可以使用之前的最新一代MY.DSN(-1).
需要注意一些事项,如果您在MY.DSN没有指定代数的情况下进行编码,您将获得所有现存的代数.
如果GDG不是您想要的,您还可以在为新数据集编目的步骤前编写IDCAMS步骤.IDCAMS步骤的目的是删除数据集.DELETE如果数据集不存在,IDCAMS 命令将为您提供错误的返回码(12,如果内存服务),但您可以IF MAXCC=12 THEN SET MAXCC=0在这些情况下通过编码对其进行修改.
根据允许的内容更新每个额外限制
如果你想要的是创建数据集,如果它不存在,并追加到它,如果是的话,可以与完成DISP=(MOD,CATLG).我不相信有一种方法可以实现你所说的目标,而不使用IDCAMS或编写一个基本上与IDCAMS相同的clist或Rexx程序DELETE.
DISP=(NEW,CATLG)如果数据集已存在,您可以编写代码并让作业失败.这是一件可怕的事情,但我认为它符合你的标准.
我现在无法测试这个,但你可能会尝试......
//CKEXIST1 EXEC PGM=IEFBR14
//DD001 DD DISP=OLD,DSN=MY.DSN
//*
//IF001 IF CKEXIST.RUN=TRUE THEN
//* step with DISP=OLD
// ELSE
//* step with DISP=NEW
//IF001E ENDIF
Run Code Online (Sandbox Code Playgroud)
...但即使它有效,我仍然觉得它很难看.这个想法是IEFBR14步骤不会执行,因为数据集分配将失败.IF001语句正在检查步骤是否已运行,我认为如果数据集不存在则将测试为false,如果数据集不存在则为true.这不是我为生产作业流推荐的东西.