1

我使用了以下jcl:

//STEP1    EXEC PGM=IEBGENER                            
//SYSUT1   DD   DUMMY,RECFM=FB,LRECL=80                  
//SYSUT2   DD   DSN=RK.MYDIR.FILES(NEW1),DISP=(SHR)      
//SYSPRINT DD   SYSOUT=*                                
//SYSIN    DD   DUMMY

我能够创建它。但我无法理解这里的代码。是否有可能使用 IEFBR14 创建。如果不是,这是唯一的方法。请向我解释代码。谢谢

4

6 回答 6

8

它不能用 IEFBR14 完成

IEBCOPY 更合适: http: //publib.boulder.ibm.com/infocenter/zos/basics/index.jsp ?topic=/com.ibm.zos.zdatamgmt/zsysprogc_utilities_IEBCOPY.htm

这是有助于解释 IEBGENER 的参考:http: //publib.boulder.ibm.com/infocenter/zos/basics/index.jsp ?topic=/com.ibm.zos.zdatamgmt/zsysprogc_utilities_IEBGENER.htm

于 2012-03-16T01:22:30.273 回答
4

如果您对其原因感兴趣,请了解 IEFBR14 实际上并没有打开您在 JCL 中编写的任何 DD 语句。相反,它只是驱动系统分配(和释放)例程的一种简写方式。实际上,如果您查看 iEFBR14 的汇编程序列表,您会发现它只有两条指令:将 R15 返回码设置为零,然后退出。

对于批处理,其想法是系统(JES 加上批处理启动器)应该在应用程序启动之前完成大量工作。因此,如果您分配一个新数据集,或引用(例如)一个需要操作员安装时间的磁带设备,系统甚至会在您的程序启动之前为您完成所有这些工作。IEFBR14 是使用系统分配例程分配文件的便捷方式,它使用 JCL 的这些功能。

但是在访问 JCL 中的 PDS 数据集时有一个问题,就像您正在尝试做的那样。

当您在 JCL 中指定 DSN(MEMBER) 语法时,分配例程并不特别关心 MEMBER 部分 - 结果,这不是发起者的功能,而是在 OPEN/CLOSE 中实现。在您的示例中,分配验证数据集是否存在(因为您编码 DISP=SHR),并且当程序打开 DD 语句时,打开例程会自动发出 BPAM FIND/POINT/STOW 以将您带到您指定的 PDS 成员。这就是您的 PDS 成员的创建方式,因此您需要使用实际打开文件的程序(IEBGENR、IEBUPDTE、IEBCOPY、IDCAMS 等都可以使用)。

一个不相关的小评论是,您可能需要小心使用 DISP=SHR 更新数据集(尤其是 PDS)。如果您设法弄错时间,理论上其中两个作业可能会同时运行,这可能会导致数据集损坏。除非您确定您是唯一访问 PDS 的任务,否则在这种情况下使用 DISP=OLD 会更安全。

于 2012-07-11T21:06:32.253 回答
1

如果要将 DSN 的内容复制到新成员中,请使用 IEBGENER。

要动态设置新 DSN 的属性,请使用 LIKE 参数。

例如(使用上面的 Mikes 示例)

//STEP1    EXEC PGM=IEBGENER                            
//SYSUT1   DD   DISP=SHR,DSN=your.input.dataset                  
//SYSUT2   DD   DISP=(,CATLG,DELETE),DSN=your.output.dataset,
//              LIKE=your.input.dataset      
//SYSPRINT DD   SYSOUT=*                                
//SYSIN    DD   DUMMY   <-- no CONTROL statements

LIKE 属性使您可以使用您指定的数据集的属性轻松创建新数据集,我还更改了配置以反映新 DSN 应设置的内容。

于 2013-10-09T09:35:54.500 回答
1

如果您想一次创建多个成员,我建议使用 IEBUPDTE。

来自 IBM:

这个基本示例使用 IEBUPDTE 将两个 JCL 过程添加到名为 MY.PROCLIB 的数据集中:

//ADDPROC1 JOB 1,SMCHUGH,MSGCLASS=X
//         EXEC PGM=IEBUPDTE
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD DISP=OLD,DSN=MY.PROCLIB
//SYSUT2   DD DISP=OLD,DSN=MY.PROCLIB
//SYSIN    DD DATA
./ ADD LIST=ALL,NAME=MYJOB1
//STEP1 EXEC=SUZNX1
//PRINT DD SYSOUT=A
// (more JCL for MYJOB1)
//SYSUDUMP DD SYSOUT=* (last JCL for MYJOB1)
./ REPL LIST=ALL,NAME=LASTJOB
//LIST EXEC PGM=SUZNLIST
// (more JCL for this procedure)
//* LAST JCL STATEMENT FOR LASTJOB
./ ENDUP
/*

这将创建一个新成员 MYJOB1,但您可以看到它也可以替换成员 (LASTJOB)。

http://publib.boulder.ibm.com/infocenter/zos/basics/topic/com.ibm.zos.zdatamgmt/zsysprogc_utilities_IEBUPDTE.htm

于 2012-06-13T21:49:04.950 回答
1

警告!-- 重新使用带有 SYSUT2 的 IEBGENER DD DSN=PDS(MEMBER):不要忘记指定成员名称 -- 如果这样做,IEBGENER 将从头开始用它在 SYSUT1 中找到的任何内容覆盖您的 PDS,首先是破坏您的PDS目录!

于 2018-01-12T11:43:32.717 回答
0

IEBGENER 实用程序用于复制单个文件。

SYSUT1 DD 名称用于提供要从中复制的 INPUT 或文件。

SYSUT2 DD 名称是 OUTPUT 文件。

SYSIN DD 提供 CONTROL 语句(如果有)。

//STEP1    EXEC PGM=IEBGENER                            
//SYSUT1   DD   DISP=SHR,DSN=your.input.dataset                  
//SYSUT2   DD   DISP=SHR,DSN=your.output.dataset      
//SYSPRINT DD   SYSOUT=*                                
//SYSIN    DD   DUMMY   <-- no CONTROL statements

请注意,文件/数据集可以是顺序数据集或分区数据集的成员。

//SYSUT1   DD   DISP=SHR,DSN=your.input.dataset(member)                  
//SYSUT2   DD   DISP=SHR,DSN=your.output.dataset(member) 
于 2012-04-22T15:07:29.310 回答