这是去上海的前一天写的,当时我是多么的兴奋,多么的对未来充满幻想,现在一切尽不在掌握之中,我的心情有点郁闷。。。
今天是去上海的前一天,我们去办理入职手续,同学们穿起正装还是人模狗样的嘛,哈哈,有点搞。。。
办理On Board手续之郁闷,一切尽在不言中。。。
继续练习JCL,虽说速度确实有点慢,可是我也尽力了,时间有限啊,我也不是那种只顾着学习的人,常去的BLOG还是要看,枪枪三人行也要看,还要关注一下WAR3,关注一下出了什么碟子,还要听音乐,一天的空闲时间就那么多,所以也就只有这点时间来学大机了。前几天练习了基本语法以及系统实用程序IEFBR14,以及IEBGENER的基本用法,凡是涉及到流内控制语句的就先放下了,不太看得懂,然后今天就轮到IEBCOPY了,不过先把前面的EFBR14,以及IEBGENER进行一个总结,但是首先应该注意的一点是凡是以IEB打头的数据集实用程序均不可用于VSAM数据集!
IEFBR14
IEFBR14 是一个不含控制语句的实用程序,它可以用来创建或删除磁盘数据集。下面
是它的应用实例:
例 . 数据集的删除
//DELETE JOB …
// EXEC PGM=IEFBR14
//DD1 DD DSN=data.set.name,DISP=(OLD,DELETE)
/*
需要注意的是,如果要删除的数据集已编目,用户不能在指定UNIT 或者VOL=SER 参
数。如果用户指定了以上参数,那么数据集虽然同样被删除,但不能被反编目。(其实我现在连这几个参数的实际意义,编目,反编目都理解得不大好,失败)。
IEBGENER 程序主要用于:
(1) 建立顺序数据集、分区数据集或扩展分区数据集成员的备份。这个拷贝可以是磁带到磁带、磁盘到磁盘或磁盘到磁带。注意:如果需要将备份数据集放在原数据集所在的卷,它们两者不能同名。
(2 )从顺序数据集产生分区数据集或扩展分区数据集。通过实用程序控制语句,将顺序数据集逻辑化分为若干个记录组并为其分配成员名,之后 IEBGENER程序把这些新建的成员放到指定的分区数据集或扩展分区数据集中。注意:对于含有跨区记录的数据集不能产生分区数据集或扩展分区数据集。
(3)为分区数据集添加新成员。IEBGENER 程序将输入的顺序数据作为一个成员加到指定的分区数据集或扩展分区数据集中。
(4 )产生一个编辑的顺序数据集、分区数据集或扩展分区数据集。通过使用实用程序控制语句,指定一个或一组记录或整个数据集的编辑信息。
(5) 处理含有双字节字符数据集。用 IEBGENER 可以拷贝、编辑、重新组块或打印含有双字节字符(DBCS)的数据,也可以将含有DBCS 数据的顺序数据集转换 成为分区数据集。
(6) 打印顺序数据集、分区数据集或扩展分区数据集的成员。
(7) 对数据集的逻辑记录进行重新组块或改变其长度。
(8) 为顺序输出数据集拷贝用户标号。
(9) 为用户例程提供编辑设施及出口,该例程用于处理标号、受控输入数据及永久性输入输出错误。
下面是IEBGENER 的作业控制语句列表:
语 句 | 说 明 |
JOB | 作业初始 |
EXEC | 指定程序名PGM=IEBGENER |
SYSPRINT DD | 指定系统输出数据集 |
SYSUT1 DD | 定义输入数据集 |
SYSUT2 DD | 定义输出数据集 |
SYSIN DD | 定义控制数据集,控制语句可以是GENERATE、EXITS、LABELS、MEMBER、RECORD |
控制语句说明:
GENERATE:指明成员名和别名数、记录标识符、文字及控制数据集中的编辑信息。
EXITS:指明用户出口例程。
LABELS:特指用户标号处理。
MEMBER:指定新建分区数据集或扩展分区数据集的成员名或成员别名。
RECORD:定义将处理的记录组并提供编辑信息。
例 1.//PRINT JOB …
//STEP1 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=A
//SYSIN DD DUMMY
//SYSUT1 DD DSN=INPUT,UNIT=3380,DISP=SHR,
// DCB=(RECFM=F,LRECL=80,BLKSIZE=80),VOL=SER=111112
//SYSUT2 DD SYSOUT=A,DCB= DCB=(RECFM=F,LRECL=80,BLKSIZE=80)
上面是一个打印顺序数据集的例子。由于该作业不需要公用程序的控制语句,因此SYSIN DD 语句定义了空数据集DUMMY,SYSUT1 定义了输入顺序数据集INPUT,SYSUT2
定义了输出数据集的输出设备,其中DCB 参数用于改变数据输出格式。
下面正式开始
IEBCOPY:
IEBCOPY系统实用程序的功能是拷贝,压缩和合并分区数据集以及扩展分区数据集,变更分区数据集或者扩展分区数据集的成员,为选择的成员更换新名,对加载模块进行拷贝和重新组块。
下面是IEBCOPY 的作业控制语句列表:
语 句 | 说 明 |
JOB | 作业初始 |
EXEC | 定义程序名PGM=IEBCOPY |
SYSPRINT DD | 定义由IEBCOPY 产生的系统输出信息 |
SYSUT1 DD | 定义输入的分区数据集或扩展分区数据集 |
SYSUT2 DD | 定义输出的分区数据集或扩展分区数据集 |
SYSUT3 DD | 定义一个溢出数据集,该语句在没有足够的虚拟空间存放输入的分区数据集或扩展分区数据集目录入口时使用 |
SYSUT4 DD | 定义一个溢出数据集,该语句在没有足够的虚拟空间存放输出的分区数据集或扩展分区数据集目录入口时使用 |
SYSIN DD | 定义控制语句,可在这里定义的语句有:COPY 、ALTERMOD 、COPYMOD、SELECT、EXECLUDE |
下面对控制语句进行说明:
COPY:启动一个或多个拷贝、写在或加载操作。其格式为;
label COPY OUTDD=ddname
,INDD=({ddname | (ddname,R)},…)
,LIST={YES|NO}
操作数说明:
“OUTDD=ddname”:指定输出的分区数据集名,这里的ddname 必须是本作业步中的一个DD 语句名。
“INDD=({ddname | (ddname,R)},…)”:指定输入分区数据集或扩展分区数据集,对于卸载操作只能指定一个ddname,这里的R 表示从输入的数据集中选择所有的成员进行相应的操作,此时不需设置 SELECT 语句。
“LIST={YES|NO}”:指出是否将拷贝的成员名列在SYSPRINT 数据集中,取值为YES
时将成员名列表。
需要注意的是:
(1)如果为拷贝操作,输入数据集和输出数据集必须是分区数据集、扩展分区数据集或卸载模块结果的顺序数据集;
(2)如果是加载操作(什么是加载操作啊?),输入数据集必须是分区数据集或顺序数据集,而输出数据集则必须是分区数据集;
(3)如果是卸载操作,输入数据集必须是分区数据集、扩展分区数据集或顺序分区数据集,输出数据集可以驻留在直接存取卷上,也可以驻留在磁带卷上。当驻留在磁带卷上时,它的组织结构必须是顺序数据集,且要指定省略目录或缩影值得
SPACE 参数:
ALTERMOD:指明加载模块变更的开始,其格式为:
label ALTERMOD OUTDD=ddname,LIST={YES|NO}
操作数说明:
“OUTDD=ddname”:指定要变更的数据集;
“LIST={YES|NO}”:指明是否将变更成员名列在 SYSPRINT 数据集中,取值为 YES
时,被变更的所有成员名列在SYSPRINT 数据集中。
COPYMOD:指明对拷贝和加载模块从新组块的操作,其格式为:
label COPYMOD OUTDD=ddname
,INDD=({ddname | (ddname,R)},…)
,MAXBLK={nnnn|nnK}
,MINBLK={nnnn|nnk}
,LIST={YES|NO}
操作数说明:
“OUTDD=ddname”:指定加载模块要拷贝到的分区数据集;
“INDD=({ddname | (ddname,R)},…)”:指定输入数据集名,该数据集是一个加载模块库,并在本作业的一个名为ddname 的DD 语句中定义,这里的R 表示从输入的数据集中选择所有的成员进行拷贝,并变更输出加载模块库中任何指定的成员名,此时不需设置 SELECT语句;
“MAXBLK={nnnn|nnK}”:指定输出分区数据集记录的最大块值,通常设置的值要小于缺省值,以便数据记录能和其它系统或程序兼容,nnnn 是一个十进制数,nnK 则表示nn千字节,其缺省值是输出数据集的块大小;
“MINBLK={nnnn|nnk}”: 指定输出分区数据集记录的最小块值,缺省值为 1K;
“LIST={YES|NO}”:指明是否将变更成员名列在 SYSPRINT 数据集中,取值为 YES
时,被变更的所有成员名列在SYSPRINT 数据集中。
SELECT:确定输入数据集中要拷贝的成员名,其格式为:
label SELECT MEMBER=({name1| (name1,newname1,R)|(name1, ,R)}|
,(name2,newname2,R)|(name2,,R)},。。。)
操作数说明:
“MEMBER=…”:name 确定拷贝的成员名;newname 确定拷贝输出的成员名,如果这个名字在输出分区数据集中已存在,则这个成员不被拷贝,除非同时设置R 参数,newname 和ALTERMOD 不能同时使用。
EXCLUDE:确定输入数据集中不被拷贝和不加载的成员,其格式为:
label EXCLUDE MEMBER=(name1,name2,…)
下面是几个实例:
例 1.
//COPY JOB…
//JOBSTEP EXEC PGM=IEBCOPY
//SYSPRINT SYSOUT=A
//SYSUT1 DD DSN=DATASET5,UNIT=disk,VOL=SER=111113,
// DISP=SHR
//SYSUT2 DD DSN=DATASET4,UNIT=disk,VOL=SER=111112,
// DISP=(NEW,KEEP),SPACE=(TRK,(5,1,2))
上面是一个拷贝整个数据集的例子。在该例中,SYSOUT1 DD 定义一个含有两个成员的分区数据集DATASET5,SYSUT2 DD 定义一个新的分区数据集DATASET4,并为它分配
5 个磁道,其中两个磁道分配给目录区。在这个例子中不需要 SYSIN DD 语句,它把数据集
DATASET5 的所有成员都拷贝到数据集DATASET4 中。
例2.
//COPY JOB …
//JOBSTEP EXEC PGM=IEBCOPY
//SYSPRINT DD SYSOUT=*
//OUT1 DD DSN=DATESET1,UNIT=disk,VOL=SER=111112,
// DISP=(OLD,KEEP)
//IN6 DD DSN=DATASET6,UNIT=disk,VOL=SER=111115,
// DISP=OLD
//IN5 DD DSN=DATASET5,UNIT=disk,VOL=SER=111116,
// DISP=(OLD,KEEP)
//SYSUT3 DD UNIT=SYSDA,SPACE=(TRK,(1))
//SYSUT4 DD UNIT=SYSDA,SPACE=(TRK,(1))
//SYSIN DD *
COPYOPER COPY OUTDD=OUT1
INDD=IN5,IN6
SELECT MEMBER=(B,,R),A)
/*
上面是一个拷贝、置换被选择的数据集成员的例子。在该例中:
OUT1 DD 语句定义含有三个成员(A、B 和F )的分区数据集DATASET1;
IN6 DD 语句定义含有三个成员(B、C 和F )的分区数据集DATASET6;
IN5 DD 语句定义含有两个成员(A、C)的分区数据集DATASET5;
SYSUT3 和 SYSUT4 DD 语句定义临时溢出数据集,并为它们分配一个磁道;
SYSIN DD 语句定义流内控制数据集,它包含一个 COPY 语句、一个INDD 语句和一个SELECT 语句。OUTDD 参数指定 DATASET1 作为输出数据集,INDD 指定 DATASET5 作
为第一个处理的输入数据集,而 DATASET6 作为第二个处理的输入数据集,它的处理顺序
为:
(1)在DATASET5 中查询所选择成员。
(2 )首先查到成员A,但不拷贝到DATASET1 中,因为DATASET1 中已经含有成员A 且没有设置R 参数、。
(3)在DATASET5 中未查到所需要的成员,继续在DATASET6 中查找。
(4 )找到成员B 并拷贝到DATASET1 中,虽然DATASET1 中已经含有成员B,但在 这里设置了R 参数。SELECT 指定从输入数据集拷贝选择的成员到输入数据集。
例3.
//CONVERT JOB …
//STEP1 EXEC PGM=IEBCOPY
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=PDSSET,DISP=SHR,DSNTYPE=PDS
//SYSUT2 DD DSN=PDSSET,LINK=PDSSET,DSNTYPE=LIBRARY,
// DISP=(NEW,CATLG)
上面是一个分区数据集转换为扩展分区数据集的例子。在该例中,SYSUT1 DD 语句定义一个输入的分区数据集 PDSSET,SYSUT2 DD 语句定义输出的扩展分区数据集 PDSE,所有的扩展分区数据集都是由存储管理子系统(SMS)进行管理,其中LINK 子参数为扩展分区数据集设置DCB 和 SPACE 特性,DSNTYPE 子参数指出新建数据集是扩展分区数据集而不是分区数据集。这里不需要 SYSIN DD 语句。
例4.
//UNLOAD JOB …
// EXEC PGM=IEBCOPY
//SYSPRINT DD SYSOUT=A
//SYSUT1 DD DSN=inpds,DISP=SHR
//SYSUT2 DD DSN=tape.dataset.name,UNIT=TAPE,
// VOL=SER=tape#,LABEL=#,DISP=(NEW,PASS)
//SYSIN DD DUMMY
/*
上面是将一个分区数据集转存为磁带上的顺序数据文件的例子。
例 5.
//UPLOAD JOB …
// EXEC PGM=IEBCOPY
//SYSPRINT DD SYSOUT=A
//SYSUT1 DD DSN=tape.dataset.name,DISP=(OLD,PASS),
// UNIT=TAPE,VOL=SER=tape#,LABEL=#
//SYSUT2 DD DSN=outpds,DISP=SHR
//SYSIN DD DUMMY
/*
上例是将一个转存为磁带上顺序文件的分区数据集按原有的DCB 属性恢复到DASD 上 (假定该分区数据集已经存在)。
IEBPTPCH
IEBPTPCH 可以用来打印输出部分或整个顺序或分区数据集。打印记录的格式可以采用
标准格式也可以由用户指定。
标准的格式是:
l 一行只打印一个逻辑记录。
l 每行的输出格式为:每8个字符为一组,每组之间由2个空格隔开。
l 不能打印的字符显示为空格。
l 如果输入是分块的,那么每个逻辑记录以“*”号间隔,而每个块之间以“**”分隔。
l 每页打印16行。
在输出设备的容量范围内,用户可以自定义输出记录的格式。IEBPTPCH提供了可选的
编辑功能来处理输入或输出记录。
IEBPTPCH可以用来打印:
1. 整个顺序数据集或分区数据集(或扩展分区数据集);
2. 一个分区数据集(或扩展分区数据集)的部分成员;
3. 一个顺序数据集或分区数据集(或扩展分区数据集)的部分记录;
4. 一个分区数据集(或扩展分区数据集)的目录;
5. 打印一个顺序数据集或或分区数据集(或扩展分区数据集)的修改版(Edited version )。
下面是IEBPTPCH 的作业控制语句列表:
语 句 | 说 明 |
JOB | 作业初始 |
EXEC | 定义程序名PGM=IEBPTPCH |
SYSUT1 DD | 定义输入的数据集 |
SYSUT2 DD | 定义输出的数据集,如果定义为 SYSOUT=A,则为打印输出 |
控制语句说明:
PRINT:表示输入数据集将被打印。如果要进行打印操作,它必须是第一条操作语句。
MEMBER:说明一个分区数据集中需要打印的成员。
RECORD:说明用户设定的打印格式。
TITLE:指定一个标题。该标题将被打印在所有数据之前。每个打印作业可以包含两个
TITLE 语句,第一个TITLE 语句指定标题,而第二个TITLE 语句指定子标题。
实例:
一个一般的调用IEBPTPCH 的作业格式如下:
//EXAMPLE JOB …
// EXEC PGM=IEBPTPCH
//SYSPRINT DD SYSOUT=A
//SYSUT1 DD …
//SYSUT2 DD …
//SYSIN DD *
在此处放置IEBPTPCH 的实用程序控制语句
/*
1:要打印一个顺序数据集或分区数据集,那么//SYSUT1 DD 语句应该定义为:
l 磁带上的数据集:
//SYSUT1 DD DSN=tape.dataset.name,UNIT=TAPE,
// VOL=SER=tape#,LABEL=#,DISP=OLD
l 顺序的 DASD上的数据集:
//SYSUT1 DD DSN=seq.dataset.name,DISP=SHR
l 分区数据集:
//SYSUT1 DD DSN=pds.name,DISP=SHR
2.要打印分区数据集中的部分成员,那么//SYSUT1 DD 语句应该定义为:
//SYSUT1 DD DSN=pds.name,DISP=SHR
并且, 实用程序控制语句应为:
PRINT MAXNAME=n
MEMBER NAME=member1
MEMBER NAME=member2
.
.
.
MEMBER NAME=membern
其中,n 是所要打印的成员总数,而 member1,member2,...,membern 是所要打印的成员名字。
3.要打印顺序数据集或分区数据集的部分记录,那么//SYSUT1 DD 语句应该定义为:
//SYSUT1 DD DSN=data.set.name,DISP=SHR
并且, 实用程序控制语句应为:
PRINT MAXFLDS=f,MAXGPS=g,MAXLITS=l,STOPAFT=nnnnn
RECORD IDENT=(length,'name',inloc),FIELD=(length,inloc,,outloc)
其中:
f:表示RECORD 语句中,FIELD 参数的个数
g:表示RECORD 语句中,IDENT 参数的个数
l:表示RECORD 语句中,IDENT 标示符中包含的字符数(最多32,767 个)
nnnnn:表示要打印的逻辑记录的个数
length:输入记录中包含identifying name 的区域长度(以字节为单位),该长度不能超过 8 个字节
‘name’:该标识符用来精确标示记录组的最后一个记录
inloc:表示输入记录中包含identifying name 的区域的开始位置
outloc:表示输出记录中该区域的开始位置
4.要打印一个分区数据集的目录,那么//SYSUT1 DD 语句应该定义为:
//SYSUT1 DD DSN=pds.name,DISP=SHR
并且, 实用程序控制语句应为:
PRINT TYPORG=PS
TITLE ITEM=('PRINT PARTITIONED DIRECTORY OF A PDS',outloc)
其中:
TYPORG=PS:表示分区数据集的目录是一个顺序的结构
outloc:在输出结构ITEM 参数的内容的起始位置
5.要打印分区数据集或顺序数据集的修改版本,那么//SYSUT1 DD 语句应该定义为:
//SYSUT1 DD DSN=data.set.name,DISP=SHR
并且, 实用程序控制语句应为:
PRINT MAXFLDS=f,CDSEQ=seqno1,CDINCR=incr
RECORD FIELD=(72)
其中:
f:表示RECORD 语句中,FIELD 参数的个数
seqno1:第一行的序号
incr:增加序号的数量
FIELD=(72):表示输入记录的1-72 列将被打印,73-80 行将被新增的序号替代。
6.使用标准格式打印一个分区数据集的成员,但其中的数字将转换为16 进制的格式打印,那么//SYSUT1 DD 语句应该定义为:
//SYSUT1 DD DSN=data.set.name,DISP=SHR
并且, 实用程序控制语句应为:
PRINT TYPORG=PO,TOTCONV=XE,MAXNAME=n
MEMBER NAME=member1
MEMBER NAME=member2
。
。
。
MEMBER NAME=membern
其中,XE 表示将数字由十进制转换为十六进制输出。
需要注意的是,IEBPTPCH 的控制语句还有许多参数在本节中并没有办法一一介绍,读
者需要参考有关手册进行使用。
IEBCOMP
IEBCOMPR 程序用于在两个数据集的逻辑记录间进行比较,这两个数据集可以是顺序
数据集、分区数据集或扩展分区数据集。它能对数据集或数据集成员的定长、变长、组块
非组块或未定义记录进行比较。但它不能对加载模块进行比较。
两个顺序数据集比较相同,是指它们含有相同数量的记录且相关记录和关键字完全相
同。而两个分区数据集或两个扩展分区数据集比较相同,则是指:
(1)相关成员含有相同的记录;
(2)注释列表在相关成员的位置相同;
(3)相关记录和关键字完全相同;
(4)相关目录和用户数据区完全相同。
对于相同的数据集必须同时满足这些条件,否则不能视其为相同数据集。
需要注意的是,对于分区数据集和扩展分区数据集,只有其中一个数据集的所有目录项
名字在另一个数据集的目录中都能找到相同的目录项名时,才能进行比较。否则是不能比较的。 如图所示:
下面是关于 IEBCOMPR 程序语句的列表:
语 句 | 功 能 |
JOB | 作业开始 |
EXEC | 定义程序名 PGM=IEBCOMPR |
SYSPRINT DD | 指定系统输出数据集 |
SYSUT1 DD | 定义需要比较的数据集 |
SYSUT2 DD | 定义需要比较的数据集 |
SYSIN DD | 定义控制数据集或 DUMMY,控制语句可以是 COMPARE、EXITS、 LABELS |
控制语句说明:
COMPARE:定义数据集的组织结构,在 SYSIN DD 中设置控制语句时,它必须是
第一个控制语句,当输入数据集是分区数据集或扩展分区数据集时,必须设置这个语句,语句格式如下:
label COMPARE TYPROG={PS/PO}
其中 TYPROG={PS/PO}用于指定输入数据集的组织结构,PS表示输入数据集为顺序数据集,为缺省值;PO表示输入数据集是分区数据集或扩展分区数据集。
EXITS:定义用户所用的出口例程。当用户调用出口例程时,需要用该语句。当设置多
个 EXITS时,IEBCOMPR 将只用最后一个。EXITS的语句格式为:
label EXITS INHDR=例程名
,INTLR=例程名
,ERROR=例程名
,PRECOMP=例程名
其中“INHDR=例程名”指定处理用户输入头标的例程名;“INTLR=例程名”指定处理
用户输入尾标的例程名;“ERROR=例程名”指定出错处理接收控制的例程名;
“PRECOMP=例程名”指定一个例程名,该例程在 IEBCOMPR 比较输入数据集之前对逻辑
记录进行处理。
LABELS:指定是否将用户标号作为数据来处理,当设置多个 LABELS 语句时,
IEBCOMPR程序只用最后一个,LABELS语句的格式为:
label LABELS DATA={YES | NO | ALL| ONLY}
其中 DATA= {YES | NO | ALL| ONLY}指明是否将用户标号作为数据处理。DATA的取
值如下:
YES:所有用户标号都作为数据处理,并依照返回码,将标号作为数据终止来处理,该
值为缺省值。
NO:仅将用户标号作为数据处理。
ALL:所有用户标号作为数据处理,16 中返回码将使 IEBCOMPR 程序完成剩余用户标
号组的处理并终止作业步。
ONLY:只用用户头标作为数据处理,处理时不管是否有返回码。
例1. 比较两个分区数据
//DISKDISK JOB …
//STEP1 EXEC PGM=IEBCOMPR
//SYSPRINT DD SYSOUT=A
//SYSUT1 DD DSN=PDSSET1,UNIT=disk,DISP=SHR,
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=2000),
// VOLUME=SER=111112
//SYSUT2 DD DSN=PDSSET2,UNIT=disk,DISP=SHR
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=2000)
//SYSIN DD *
COMPARE TYPROG=PO
/*
在上例中,SYSUT1 DD 语句定义输入数据集(PDSSET1),这是个组块数据集,它驻
留在磁盘卷上。SYSUT2 DD 语句定义另一个输入数据集(PDSSET2),它也是个驻留在磁
盘卷上的块组数据集。SYSIN DD 语句定义流内控制数据集,其中的控制语句表示两个输入
数据集是分区数据集。
例 2. 比较磁带上的两个顺序数据集
//TAPETAPE JOB ...
// EXEC PGM=IEBCOMPR
//SYSPRINT DD SYSOUT=A
//SYSUT1 DD DSNAME=SET1,LABEL=(2,SUL),DISP=(OLD,KEEP),
// VOL=SER=001234,DCB=(DEN=2,RECFM=FB,LRECL=80,
// BLKSIZE=2000,TRTCH=C),UNIT=tape
//SYSUT2 DD DSNAME=SET2,LABEL=(,SUL),DISP=(OLD,KEEP),
// VOL=SER=001235,DCB=(DEN=2,RECFM=FB,LRECL=80,
// BLKSIZE=2000,TRTCH=C),UNIT=tape
//SYSIN DD *
COMPARE TYPORG=PS
LABELS DATA=ONLY
/*
SYSUT1 DD 定义了一个输入数据集 SET1。该数据集在一个有标号(labeled)的、7 轨
磁带卷上。
SYSUT2 DD 定义了一个输入数据集 SET2。该数据集在一个有标号(labeled)的、7
轨磁带卷上。它是该磁带上第一个或者唯一一个数据集。
SYSINDD 后的控制语句 COMPARE TYPORG=PS 表明输入数据集是顺序数据集;
LABELS DATA=ONLY 表明用户首标(header labels)被当作数据加以比较,而磁带上的其
他标号则予以忽略。
IEHLIST
IEHLIST 程序用于系统信息列表,其中包括分区数据集目录列表、VTOC 列表以及编目
列表等。下面是它的应用实例:
//LIST EXEC PGM=IEHLIST
//SYSPRINT DD SYSOUT=*
//D1 DD UNIT=SYSDA,VOL=SER=PACK11,DISP=OLD
//D2 DD UNIT=SYSDA,VOL=SER=PACK12,DISP=OLD
//D3 DD UNIT=SYSDA,VOL=SER=PACK17,DISP=OLD
//SYSIN DD *
LISTCTLG VOL=SYSDA=PACK12
LISTVTOC VOL=SYSDA=PACK11,DSN=(USER.F1)
LISTPDS VOL=SYSDA=PACK17,DSN=U1.LIB
/*
注意:DD 语句中的VOL 和UNIT 参数的设置要与 SYSIN DD 中控制语句的相关参数一致。
IEHLIST中SYSIN DD语句定义控制数据集:
IEHLIST的控制语句:
-LISTVTOC
-LISTCTOG
-LISTPDS DSNAME=(pdsname,pdsname)
-显示格式: DUMP or FORMAT
-控制语句中的DSNAME不能简写成DSN
-控制语句中的VOL参数格式为:
VOL=XXXXXXX=YYYYYYY,其中XXXXXXXXX是DD语句中的UNIT参数指定的值,而YYYYYYY是SER参数指定的值。例如:
VOL=SYSDA=USER01 or VOL=3390=USER01
DFSORT
DFSORT 程序用于数据排序,下面是它的应用实例:
//STEP1 EXEC PGM=DFSORT
//SYSIN DD *
SORT FIELDS=(1,10,CH,A)
//SORTIN DD DSN=TEST.LOG,DISP=OLD
//SORTOUT DD DSN=SORT.LOG,DISP=(NEW,PASS),
// UNIT=SYSDA,SPACE=(CYL,1)
//SORTWK1 DD UNIT=SYSDA, SPACE=(CYL,1)
STEP1 语句用于调用 DFSORT 程序;SYSIN DD 语句定义控制数据集,其中控制语句
SORT FIELDS=(1,10,CH,A)指出要排序的内容始于输入数据的第一个位置,以递增前 10 字符进行排序;SORTIN DD 语句给出用于排序的输入数据集名和状态;
SYSOUT DD语句为排序的输出结果指定数据集;
SORTWK1 DD语句为排序操作分配工作空间。
IEBUPDTE
Original URL: http://bluemainframe.net/2007/06/05/iebupdte/
IEBUPDATE 这个 UTILITY 最常见的用法是用来在分区数据集中创建多个 member,或者更新这些 member 中的数据。虽然 IEBUPDATE 能够用来处理给中类型的数据,但是主要用途还是创建或者维护JCL的过程库或者汇编语言的宏程序库。今天,这个 UTILITY 大多用来做程序产品的发布和维护了。很少被普通 TSO 用户使用。
这里有一个很基本的例子用来往 MY.PROCLIB 中添加两个 JCL 的过程的 MEMBER。运用 ISPF 也许能够很方便的完成这些事情,但是如果我们假设这个 JOB 已经在磁带上了,那么很显然就会比 ISPF 操作更加有效。
//OGDEN10 JOB 1,BILL,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=BILLX1
//PRINT DD SYSOUT=A
// (more JCL for MYJOB1)
//SYSUDUMP DD SYSOUT=* (last JCL for MYJOB1)
./ REPL LIST=ALL,NAME=LASTJOB
//LIST EXEC PGM=BILLLIST
// (more JCL for this procedure)
//* LAST JCL STATEMENT FOR LASTJOB
./ ENDUP
/*
对这个例子进行一下说明:
这是一个更新数据集的过程,所以 SYSUT1 和 SYSUT2 都指向了同一个数据集。如果指向不同的话,那么就会是一个先复制然后再更新的过程。
从SYSIN DD DATA 的格式来看,输入流的前两列会有 // 表示,它并不会被 JCL 语句打断。输入流的结尾会有 /* 的标识。IEBUPDATE 的 UTILITY 控制语句由 ./ 来引导。
一个名为 MYJOB1 的 MEMBER 被加入到 MY.PROCLIB 中。而且这个 MEMEBER 并不需要已经存在。而已经存在的 MEMBER LASTJOB 就会被新的内容替换掉。
另外,IEBUPDATE 这个 UTILITY 还能够根据控制语句中的序列号来添加或者替换相应的 MEMBER。这也是针对 JCL 语句或者源语句中那些数字序列的所剩不多的用法。
最后我们需要再次重申 IEBUPDATE 最有代表性的用法是用作程序的发布和维护。比方说,如果需要给客户的程序库中添加25个 JCL 过程,我们只需要将这25个过程作为一个程序包用 IEBUPDATE 导入。这样做的一个好处是由于所有的产品都使用一种源程序格式,客户就可以很方便的在使用之前进行审核。
以上内容来自:http://blog.youkuaiyun.com/anyue417/article/details/1798912