如何使用jcl在现有pds中创建成员

时间:2012-03-15 12:30:57

标签: mainframe jcl

我使用了下面的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创建。如果不是这就是正确的方式。请告诉我代码。谢谢

6 个答案:

答案 0 :(得分:8)

答案 1 :(得分:4)

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

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

但是在JCL中访问PDS数据集时有一个问题,就像你想要做的那样。

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

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

答案 2 :(得分: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

答案 3 :(得分: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设置为什么。

答案 4 :(得分:1)

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

答案 5 :(得分: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)