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

Posted

技术标签:

【中文标题】将 JCL 符号传递给流内数据集【英文标题】:Pass JCL symbol to in-stream data sets 【发布时间】:2011-08-09 15:41:43 【问题描述】:

我正在尝试以这种方式创建和删除数据集名称中带有 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)

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

【问题讨论】:

【参考方案1】:

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

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'
/*

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

[1]The z/OS 2.1 Information Center [2]Slides from SHARE in Boston 2013 (Tom Wasik, IBM),第 20-24 页

【讨论】:

z/OS 上的伟大开发,感谢您的意见。【参考方案2】:

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

以下内容应该适合您:

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

添加 SPACE 参数。如果数据集不存在,则会因为 MOD 配置而创建它。然后 步骤完成后它将被删除。最终结果是,在这一步之后,命名的数据集将不存在。

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

//    SET DATE=20110809

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

//    SET DATE=D2011221

一切都会好起来的。

【讨论】:

谢谢!它并没有真正将 JCL 符号传递给流媒体,但它确实适合我的需要 :) 我们不能使用 DISP=OLD 吗?我从未将它与 IEFBR14 一起使用,但猜测它是否有效。而且......如果我们想引用已经创建的数据集,那么我想这个朱利安日期有点令人困惑。我们只能使用 YYMMDD 格式来使用实际日期,对吧。只是一个建议! @Raja Reddy。不,你不应该在这里使用DISP=OLD。如果数据集尚不存在,则该步骤将失败(未找到数据集)。 DISP=MOD 将创建数据集,如果它尚不存在 - 只是这样它就可以删除它!看起来很愚蠢——但这就是它的工作方式。另一方面,如果数据集已经存在,DISP=MOD 将使用现有数据集 - 然后将其删除。最终结果是该步骤完成后数据集将不存在。 Ofcos Neal,我认为它应该存在才能删除。但是提供DISP=MOD 将是主动使用。

以上是关于将 JCL 符号传递给流内数据集的主要内容,如果未能解决你的问题,请参考以下文章

jcl 查找给定 n 个数据集的整体大小

创建分区数据集的 JCL 错误

JCL 在一行中合并记录

我可以将 C++ 字符串传递给流样式的方法吗?

仅获取记录 nr。 x 通过在 JCL 中使用 dfsort

z/VSE 示例 jcl 将顺序文件打印到假脱机