学习主机已有近一个礼拜,基本操作只能马马虎虎,说到写JCL控制语句,真是惭愧.我花了很多时间来整理JCL语法、参数等信息,并做了一篇很长很 长的类似帮助文档的笔记。不过,那只是开始,还是在理论阶段。对动手能力的提高帮助不大。这篇笔记就是专门为提高实际动手能力而写的,也是上课的内容。
实用程序UTILITY介绍:
一、系统实用程序
• IEH打头,主要功能是维护和管理系统、用户数据集和整个盘卷;
• 系统实用程序及其功能如下 :
1、IEHNITT:为磁带卷写标号;
2、IEHLIST:系统控制数据信息列表;
3、IEHMOVE:移动或拷贝若干组数据、移动或拷贝整个卷、移动或拷贝编目目录等;
4、IEHPROGM:建立及维护系统控制数据、建立时代数据组索引、重命名磁带卷、删除数据集等;
5、IEHDASDR:初始化一个直接存取卷。
二、数据集实用程序
• IEB打头,它的主要功能是对数据集或数据集记录进行组织、修改或比较。
• 可以作为单个作业来执行,也可以作为某个程序的子程序被调用。
• Notes:这些数据维护实用程序不能用于VSAM数据集。
数据集实用程序:
0、IEBGENER:拷贝顺序数据集记录或将顺序数据集转换为分区数据集;
1、IEBCOPY:拷贝、压缩或合并分区数据集及扩展分区数据集;
2、IEBPTPCH:打印或穿卡输出一个数据集
3、IEBCOMPR:比较顺序数据集、分区数据集或扩展分区数据集;
4、IEBISAM:卸载、装载、拷贝或打印ISAM数据集;
5、IEBUPDATE:对顺序、分区数据集或扩展分区数据机进行合并修改。
三、独立实用程序
• IBC开头,是一种特殊的实用程序,可独立于操作系统运行,通常被存放在磁带上。当系统出现重大故障而又无法恢复时,利用系统转储磁带,恢复系统盘卷。如:
1、IBCDASDI:用于初始化和分配一个直接存取卷上的可用的实用程序;
2、IBCDUMPRS:是转储或再存储直接存取卷数据应用程序。
实用程序的调用:
• 实用程序的调用方法有两种, 一种是在ISPF下用TSO的CALL命令调用, 另一种是通过JCL语句调用。
JCL语句调用方式:
//UTLFM JOB …
//STEP EXEC PGM=utility 调用公用程序
//SYSPRINT DD 系统输出数据集(SYSOUT)
//SYSUT1 DD … 输入数据集
//SYSUT2 DD … 输出数据集
//SYSIN DD … 定义实用程序使用的控制流/控制语句
COPY …
SELECT …
EXECLUDE …
UTILITY控制语句格式:
不以‘//’开头,分为4个区:
- 标签区(可选)
- 操作区(必须)
- 操作数区(必须)
- 注释区(可选)
[IEBGENER]
功能:
–IEBGENER是用于建立,拷贝,打印SEQUENTIAL数据集的实用程序
模板:
//ST018 JOB NOTIFY=ST018,MSGLEVEL=(1,1)
//STEP EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD …
//SYSUT2 DD …
//SYSIN DD …
......
.....
说明:
IEBGENER的JCL语句:
– EXEC语句指定要执行的程序
– SYSPRINT DD语句定义输出信息数据集
– SYSUT1 DD语句定义输入数据集
– SYSUT2 DD语句定义输出数据集
– SYSIN DD语句定义控制数据集,如果不需要控制语句,可以如下表示//SYSIN DD DUMMY
IEBGENER的控制语句:
– GENERATE
– MEMBER & RECORD • 将顺序数据集划分为多个成员
– RECORD • 只选中或打印顺序数据集的部
例1:分配一个PS顺序数据集st018.test1.test1,并且拷贝输入流数据到这个数据集中
000100 //ST018A JOB NOTIFY=ST018,MSGLEVEL=(1,1)
000200 //STEP1 EXEC PGM=IEBGENER
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSUT1 DD *
000500JONES FRED 53AF 87 5701 NINE MILE ROAD
000600ANDERSON DON 78AF 34 320 WESTHEIMER #219
000710 //SYSUT2 DD DSN=ST018.TEST1.TEST1,DISP=(NEW,CATLG,DELETE),
000800 //SPACE=(TRK,(1,1)),VOL=SER=USER02,
000900 //RECFM=FB,LRECL=80,UNIT=SYSDA
001000 //SYSIN DD DUMMY
例2:复制PS顺序数据集
000100 //ST018 JOB NOTIFY=ST018,MSGLEVEL=(1,1)
000200 //STEP1 EXEC PGM=IEBGENER
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSUT1 DD DSN=ST018.SDS.DATA,DISP=SHR
000500 //SYSUT2 DD DSN=ST018.TEST1.TEST1,DISP=OLD
000600 //SYSIN DD DUMMY
例3:将一个PS顺序数据集st018.sds.data分割成3部分,以成员形式存储在PO分区数据集 st018.test.po中
000100 //ST018A JOB NOTIFY=ST018,MSGLEVEL=(1,1)
000200 //STEP1 EXEC PGM=IEBGENER
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSUT1 DD DSN=ST018.SDS.DATA,DISP=SHR
000500 //SYSUT2 DD DSN=ST018.TEST.PO,DISP=(NEW,CATLG,DELETE),
000600 // SPACE=(TRK,(1,1,1)),VOL=SER=USER02,
000700 // RECFM=FB,LRECL=80,UNIT=SYSDA
000800 //SYSIN DD *
000900GENERATE MAXNAME=3,MAXGPS=2
001000MEMBER NAME=MEM1
001100RECORD IDENT=(8,'FIRSTMEM',2)
001200MEMBER NAME=MEM2
001300RECORD IDENT=(8,'SECNDMEM',2)
001400MEMBER NAME=MEM3
例4:从源PS顺序数据集ST018.SDS.DATA中选中一些列存储在目标PS顺序数据集ST018.TEST1.TEST1中....
000100 //ST018A JOB NOTIFY=ST018,MSGLEVEL=(1,1)
000200 //SETP1 EXEC PGM=IEBGENER
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSUT1 DD DSN=ST018.SDS.DATA,DISP=SHR
000500 //SYSUT2 DD DSN=ST018.TEST1.TEST1,DISP=OLD
000600 //SYSIN DD *
000700GENERATE MAXFLDS=3
000800RECORD FIELD=(10,1,,1),FIELD=(10,11,,20),FIELD=(10,21,,30)
例5:打印/显示顺序数据集ST018.SDS.DATA
000100 //ST018 JOB NOTIFY=ST018,MSGLEVEL=(1,1)
000200 //STP1 EXEC PGM=IEBGENER
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSUT1 DD DSN=ST018.SDS.DATA,DISP=SHR
000500 //SYSUT2 DD SYSOUT=*
000600 //SYSIN DD DUMMY
以上例子说明:
–SYSIN DD * 语句标识输入数据流记录控制语句;
–GENERATE语句表示调用编辑功能,操作数MAXFLDS=3 表示后面的RECORD语句最多描述三个区域;
–RECORD语句通过FIELD参数描述输入输出区域,其格式为:
–FIELD=(LENGTH OF FIELD,POSITION IN INPUT,CONVERSION,POSITION IN OUTPUT)
^^^^^待续~~~~~~~~~~~~~~~~
续>>(7.18)
[IEBCOPY]
EBCOPY主要功能:
–拷贝完整的数据集或部分数据集;
–建立分区数据集或扩展分区数据集的备份,备份是存放在磁带或磁盘上的顺序数据集;
–变更分区数据集或扩展分区数据集的成员、为选择的成员更换新名;
–对加载模块进行拷贝和重新组块。
模板:
JOB
EXEC PGM=IEBCOPY
SYSPRINT DD SYSOUT=*
SYSUT1 DD 输入数据集
SYSUT2 DD 输出数据集
SYSUT3 DD 溢出数据集#可以省略
SYSUT4 DD 溢出数据集#可以省略
SYSIN DD * 控制语句#如不需要控制语句,可写成SYSIN DD DUMMY
COPY
SELECT
EXECLUDE
COPY:启动一个或多个拷贝、写或加载操作
1.格式:label COPY OUTDD=ddname,INDD=({ddname| (ddname,R)},…),LIST={YES|NO}
2.操作数说明:
•“OUTDD=”:指定输出的分区数据集名,这里的数据集必须是本作业步中的一个DD语句名;
•“INDD=({ddname| (ddname,R)},…)”:指定输入分区数据集,对于卸载操作只能指定一个ddname,这里的R表示从输入的数据集中选择所有的成员进行相应的操作,此时不需设置SELECT语句。
•“LIST={YES|NO}”:指出是否将拷贝的成员名列在SYSPRINT数据集中,取值为YES时将成员名列表。
注意:
–如果为拷贝操作,输入数据集和输出数据集必须是分区数据集、扩展分区数据集或卸载模块结果的顺序数据集;
–如果是加载操作,输入数据集必须是分区数据集或顺序数据集,而输出数据集则必须是分区数据集;
–如果是卸载操作,输入数据集必须是分区数据集、扩展分区数据集或顺序分区数据集,输出数据集可以驻留在直接存取卷上,也可以驻留在磁带卷上。当驻留在磁带卷上时,它的组织结构必须是顺序数据集,且要指定省略目录或缩影值得SPACE参数。
SELECT:确定输入数据集中要拷贝的成员名
1.格式:label SELECT MEMBER=({name1| (name1,newname1,R) | (name1,,R)},{name2| (name2,newname2,R) | (name2,,R)},…..)
2.操作数说明:•“MEMBER=…”:name确定拷贝的成员名;newname确定拷贝输出的成员名,如果这个名字在输出分区数据集中已存在,则这个成员不被拷贝,除非同时设置R参数,newname和ALTERMOD不能同时使用。
EXCLUDE:确定输入数据集中不被拷贝和不加载的成员
1.格式:label EXCLUDE MEMBER=(name1, name2, name3…..)
2.操作数说明:•“MEMBER=…”:name确定不被拷贝的成员名
例1,拷贝整个分区数据集,不拷贝名字相同的成员
000100 //ST018A JOB NOTIFY=ST018,MSGLEVEL=(1,1)
000200 //STP1 EXEC PGM=IEBCOPY
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSUT1 DD DSN=ST018.PDS.DATA,DISP=SHR
000500 //SYSUT2 DD DSN=ST018.TEST.PO,DISP=(NEW,CATLG,DELETE),
000600 // SPACE=(TRK,(5,1,2)),VOL=SER=USER02,UNIT=SYSDA
注意:SYSIN DD * 语句可以省略
例2,拷贝整个分区数据集,拷贝且覆盖名字相同的成员
000100 //ST018A JOB NOTIFY=ST018,MSGLEVEL=(1,1)
000200 //STP1 EXEC PGM=IEBCOPY
000300 //SYSPRINT DD SYSOUT=*
000400 //DD1 DD DSN=ST018.PDS.DATA,DISP=SHR
000500 //DD2 DD DSN=ST018.TEST.PO,DISP=OLD
000600 //SYSIN DD *
000700COPY OUTDD=DD2,INDD=( (DD1,R)) #留意参数格式
例3,仅拷备和置换被选择的分区数据集成员
000100 //ST018A JOB NOTIFY=ST018,MSGLEVEL=(1,1)
000200 //STP1 EXEC PGM=IEBCOPY
000300 //SYSPRINT DD SYSOUT=*
000400 //DD1 DD DSN=ST018.PDS.DATA,DISP=SHR
000500 //DD2 DD DSN=ST018.TEST.PO,DISP=OLD
000600 //SYSIN DD *
000700COPY OUTDD=DD2,INDD=(DD1)
000800SELECT MEMBER=(IEBCOPY1,(IEBCOPY2,R))
例4, 拷备时排除一些分区数据集成员
//ST018A JOB NOTIFY=ST018,MSGLEVEL=(1,1)
//STP1 EXEC PGM=IEBCOPY
//SYSPRINT DD SYSOUT=*
//DD1 DD DSN=ST018.PDS.DATA,DISP=SHR
//DD2 DD DSN=ST018.TEST.PO,DISP=OLD
//SYSIN DD *
COPY OUTDD=DD2,INDD=(DD1)
SELECT MEMBER=(IEBCOPY1,(IEBCOPY2,R))
[IEPTPCH]
IEBPTPCH的功能:
–用来打印整个顺序数据集
–用来打印整个分区数据集或分区数据集的一个/多个成员
–用来打印顺序数据集或分区数据集成员的一部分内容(指所有记录的某些字段或一些记录的某些字段)
模板:
JOB
EXEC PGM= IEBPTPCH
SYSPRINT DD SYSOUT=*
SYSUT1 DD 输入数据集
SYSUT2 DD 输出数据集
SYSIN DD * 控制语句#可以是//SYSIN DD DUMMY
TITLE
RECORD
MEMBER
IEBPTPCH的控制语句说明:
–PRINT控制语句指定输入流记录以物理顺序组织
–TITLE控制语句指定输出的标题•格式TITLE ITEM=(title, col. to start it in),ITEM=(…), …
–RECORD语句通过FIELD参数描述输入输出区域
(1) 格式RECORD FIELD=(length of field,positionin input,conversion,positionin output)
(2) FIELD=(80)
–RECORD语句通过IDENT参数描述选中的记录
(1) 格式RECORD IDENT=(length<=8,’literal’,input-location)
(2) 用于决定最后一条记录
–RECORD IDENT 和FIELD一起使用
(1) 使用IDENT确定FIELD起作用的记录范围
(2) 使用FIELD确定选取的字段
–MEMBER NAME=…
•Supply PDS member name to be printed.
•If omitted when printing a pds, it prints all members.
•Must specify TYPORG=PO if printing pdsmembers because default is PS.
–MEMBER 和RECORD一起使用
•All RECORD statements that follow a MEMBER statement pertain to the member indicated in the member statement.
•If no RECORD statements follow, the member is printed with the default conditions.
[IEHLIST]
JOB
EXEC PGM= IEHLIST
SYSPRINT DD SYSOUT=*
SYSIN DD * 控制语句
LISTVTOC
LISTCTLG
LISTPDS
IEHLIST的功能
用于列出DASD VTOC的内容
用于列出CATALOG的内容
用于列出PDS的目录
IEHLIST的JCL语句
SYSIN DD语句定义控制数据集
IEHLIST的控制语句
–LISTVTOC
– LISTCTLG
– LISTPDS DSNAME=( LISTPDS DSNAME=(pdsname,pdsname pdsname,pdsname)
– 显示格式显示格式
• DUMP DUMP or or FORMAT FORMAT
–控制语句中的DSNAME不能简写成DSN
–控制语句中的VOL参数格式为VOL=XXXXX=YYYYYY, 其中XXXXX是DD语句中的UNIT参数定的值而YYYYYY是SER参数指定的值
•例子OL=SYSDA=USER01 or VOL=3390=USER01x
[IEBCOMPR]
JOB
EXEC PGM= IEBCOMPR
SYSPRINT DD SYSOUT=*
SYSUT1 DD 参与比较的数据集
SYSUT2 DD 参与比较的数据集S
YSIN DD * 控制语句
COMPARE
EXTS
LABELS
IEBCOMPR的功能
可以用于比较SDS和PDS
以记录为单位进行比较
常用于检测备份
IEBCOMPR的JCL语句
SYSUT1 DD语句定义参与比较的数据集
SYSUT2 DD语句定义参与比较的数据集
SYSIN DD语句定义控制数据集
IEBCOMPR的控制语句
COMPARE TYPORG=PS|PO
EXTS identifies user exit routines to be used
LABELS whether user labels are to be treated as data
[SORT]
JOB
EXEC PGM= SORT
SYSOUT DD SYSOUT=*
SORTIN DD 输入数据集
SORTOUT DD 输出数据集
SYSIN DD * 控制语句
SORT
SORT的功能
对数据集内容进行排序
SORT的JCL语句
SORTIN DD语句定义输入的待排序数据集,可以有多个
SORTOUT DD语句定义输出的已排序后的数据集
SYSIN DD语句定义控制数据集
SORT的控制语句
SORT FIELDS=(start column, length, sort method, a/d )
OUTFIL FNAMES=指定输出数据集
小结:
第一次写JCL调用实用程序,难免会有些磕磕碰碰,所以不可避免犯了些低级错误.
错误归结:
1、MSGLEVEL(1,1)#忘记写等号
2、noplaceto directory#创建PDS时directory block设置太小,所以不能再创建成员.
3、MEMBER 执行错误#参数名超过8个字符。。老师说如果某个名字超过8个字符,就得警惕
4、使用COPY参数时,OUTDD的值不能加括号! INDD的值必须加括号! INDD=(DD2,R)是错的
5、SELECT和EXCLUDE参数不可同时出现,否则出错。
重要点 :创建数据集时,SPACE(TRK,(1,,A)).其中,A=0时,代表创建的是SDS,A>0时,代表创建的是PDS,切记切记!!