将JCL符号传递给流内数据集

use*_*959 4 mainframe jcl

我正在尝试以这种方式在数据集名称中创建和删除带有JCL符号的数据集:

//    SET DATE=20110809
//* DELETE DATASET
//DEL01 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
           DELETE DATASET.TEMP.&DATE                PURGE
           SET MAXCC = 0
//* CREATE DATASET
//STEP01   EXEC PGM=IEFBR14
//DELDD    DD DSN=DATASET.TEMP.&DATE,
//            DISP=(NEW,CATLG,DELETE)
Run Code Online (Sandbox Code Playgroud)

问题是我不能在一个instream(SYSIN DD*)中使用JCL符号.我不能确定数据集是否已经存在,所以我不能只使用DISP =(MOD,DELETE,DELETE).有没有其他方法可以删除数据集?

Nea*_*alB 7

您发现JCL不支持内联数据中的符号替换...

以下内容对您有用:

//DEL01   EXEC PGM=IEFBR14          
//DELDD    DD DSN=DATASET.TEMP.&DATE, 
//         DISP=(MOD,DELETE,DELETE), 
//         SPACE=(TRK,0)             
Run Code Online (Sandbox Code Playgroud)

添加SPACE参数.如果数据集不存在,则会因为MOD处置而创建它.然后在步骤完成时删除它.最终结果是,在此步骤之后,命名数据集将不存在.

我看到的唯一真正的问题是:

//    SET DATE=20110809
Run Code Online (Sandbox Code Playgroud)

您给出的日期长度为8个字符(最大限定符长度),但不以字母或国家字符开头(以数字开头).这将导致无效的数据集名称.如果您只是为其添加alpha前缀,则数据集DATE qualifer将变得太长.解决此问题的常见方法是使用Julian日期,如:2011221.使用alpah或国家字符前缀Julian日期,如:D2011221.所以你的SET指令会变成:

//    SET DATE=D2011221
Run Code Online (Sandbox Code Playgroud)

一切都应该成功.

  • @Raja Reddy。不,您不应在此处使用“ DISP = OLD”。如果数据集尚不存在,则该步骤将失败(找不到数据集)。如果尚不存在,`DISP = MOD`将创建数据集-以便随后可以删除它!看起来很蠢-但这就是它的工作方式。另一方面,如果数据集已经存在,则“ DISP = MOD”将使用现有的数据集-然后将其删除。最终结果是步骤完成后数据集将不存在。 (2认同)

Ben*_*Cox 6

从z/OS 1.1(2013年9月30日发布)开始,通过在语句中添加SYMBOLS关键字,可以在JES2流内数据中使用符号DD.可能的值是:

  • SYMBOLS=JCLONLY:替换插播数据中的JCL符号和JES符号.

  • SYMBOLS=EXECSYS:替换作业执行期间在系统上定义的JCL符号,JES符号和系统符号.

  • SYMBOLS=CNVTSYS:替换JCL转换期间在系统上定义的JCL符号,JES符号和系统符号.

必须已导出符号.

一个例子如下,从[2]:

// EXPORT SYMLIST=(DSN,VOL)
// SET DSN='ABC.DATA',VOL='123456'
//STEP1 EXEC PGM=USERPGM1
//DATA     DD DSN=&DSN,DISP=SHR
//SYSIN    DD *,SYMBOLS=EXECSYS
  SYSTEM=&SYSNAME,DSNAME=&DSN,VOLUME=&VOL
  FUNCTION='&APPL_NAME'
/*
Run Code Online (Sandbox Code Playgroud)

有关更多信息(包括配置符号替换日志的位置的语法),请参阅: