JCL创建数据集是否已存在

SCH*_*SCH 1 mainframe jcl zos

我想写一些JCL来创建一个数据集,其要求是:

  1. 如果数据集不存在,则创建它

并且:

  1. 如果数据集已存在,则覆盖它

要么

  1. 如果数据集已存在,则不执行任何操作

据我所知,(1)可以用DISP = NEW来完成,(2)用DISP = OLD完成,但我无法从文档和课程材料中找出同时做两者的方法.如果数据集存在,则NEW抛出JCL错误,如果不存在,则抛出一个JD错误.我不知道怎么做(3).

我知道有很多方法可以查询JCL中是否存在数据集,但是我们还没有涵盖这一点,所以我认为没有它可能吗?

csc*_*eid 5

我想你正在寻找一代数据组.这不会覆盖现有数据集,但每次执行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.这不是我为生产作业流推荐的东西.