JCL
l COND=((8,EQ),(12,EQ),(16,LE)) 在job语句中是OR的关系,但是在step中却是AND的关系。
l COND在job中,则是判断当前step的返回值和指定值的关系, 而如果在step中,则是某一个step的返回值或者even或者only与指定值进行判断。在job中,如果判断结果为yes,则job结束,不再执行后面的step。在step中,如果回答为yes,则滑过当前step(不执行),转到下一个step。
l 如果前面中有一个步骤abend了,则后面的步骤是不会被执行的,if a single step abends all other steps are bypassed if no COND statement is there。
代替COND的办法是:ex.
// IF (STEPA.RC GE 4) THEN
//jcl statements
// ELSE
//jcl statements
// ENDIF
l DD statement的使用场合:1:指定/创建数据集;//step dd dsn=… 2: 定义输出数据集: //step dd sysout=x 或者//step dd sysout=class/A/* *表示Refers to the class specified in the MSGCLASS is used 3: 标识in-stream数据流: //step dd * 或者//step dd data
l DD statement的一些参数 vol=ser, disp(disposition),unit,dcb
l 系统保留的dd step name:steplib, joblib, sysin, sysabend, sysudump, sysmdump, sysmsg, stepcat, sysprint,sysut1, sysut2
l 几个特殊的dsnname(不是ddname): &&temp(不需要指定dsn参数), 向前引用(DSN=*.STEP1.DD1)。
l DD statement的disp参数取值(status: new,mod,shr, old; abnormal disposition: catlg,uncatlg, delete, keep, pass; abnormal dispotion:catlg,uncatlg, delete, keep)
l DCB的取值(recfm: f/fb/v/fb/u; dsorg: ps/pa/da)
l SPACE 的取值SPACE=(space units,(primary,secondary,dir),RLSE) space: trk/cly/blocksize
l UNIT用于指定hardware address/type/group
l VOL=SER指定卷,向前引用: vol=ref=ddname
l STEPLIB用于指定program所在的数据集,紧跟在exec语句之后,可以覆盖joblib。
而joblib必须紧跟在job语句之后,对每个step起作用。
l Program和procedure: program是一个程序,可以完成一个定的任务,而procedure就是一个函数而已(可以实现重用),jcl是用来提交program给mvs的,在jcl中可以调用procedure,在program中不能调用procedure。在procedure中可以调用procedure, procedure中可以调用program。Steplib和joblib对应着program,而jcllib对应着procedure。
l Procedure分为in-stream和catalogued。In-stream在jcl文件中定义和使用,一个job(通常也就是一个jcl最多包含15个instream procedure)。Catalogued procedure是存放于一个pds的member中,且文件名字和porcedure名字一致,一个Catalogued procedure最多可以有255个step。使用Catalogued procedure在调用之前,必须使用//stepname jcllib order=procedure所在的pds name。
l 在jcl中调用procedure格式: //stepname exec proc=procname 或者//stepname exec procname
l 无论是哪类procedure,开始为: //procedureName PROC 只是in-stream以//pend结束,而catalogued procedure结束时不能加//pend语句。无论哪类procedure都要满足不能包含以下语句
1) JOB statement
3) JOBLIB DD statement
4) DD * , DD DATA - In-stream data
5) /* delimiter statement
6) // Null statement
7) JES statements
8) PEND statement (for cataloged procedures)
l 一个instream中不能再定义一个instream procedure(不能嵌套定义instream procedure)。
l Jcl中动态改写 exec 语句的内容。格式: PARAMETER.PROCSTEPNAME=VALUE
000111 //PROC1 PROC
000112 //STEPA1 EXEC PGM=HELLO,TIME=(1,30)
000113 // PEND
000114//STEP1 EXEC PROC1, PARM . STEPA1=‘X=VENKAT’,
TIME . STEPA1=…
l 再jcl中同台改写 dd 语句的内容:格式:PROCSTEPNAME.DDNAME DD PARAMETER=VALUE(注意在覆盖原来定义的dd时,需覆盖所有的参数)
000111 //PROC1 PROC
000112 //STEPA1 EXEC PGM=HELLO
000113 //STEPLIB DD DSN=OPERN.CICS3.LOADLIB
000115 //NEWDS DD DSN=IN11994.MYPDS.LOADLIB,DISP=(NEW),
000116 // SPACE=(TRKS,(10,5,5))
000117 // DCB=(DSORG= PO ,LRECL=80)
000117 // PEND
000117//STEP1 EXEC PROC1
000120//STEPA1.NEWDS DD DSN=IN11994.MYPDS2.LOADLIB,
000121// DCB=(DSORD=PS)
000121 //STEPA1.STEPLIB DD DSN=IN11994.MYCOBOL.LOADLIB
000121 //STEPA1.NEWPDS DD DSN=IN11994.MYCOBOL.FIRST,
000122// DISP=(NEW,CATLG), SPACE=(TRKS,(10,5,5))
l Symbolic variable是这么回事儿!两个作用: 一是用来在jcl中调用procedure时,传递参数给procedure(当然procedure中使用的参数名字和传入的参数名字相同),二是相当于宏定义,在set语句中设置Symbolic variable的值,在后续的步骤中引用其值。
因此他可以用在set, exec, exec proc这三类语句中
l IBM定义常用program
IEBCOPY Copies, merges and compresses PDS
IEBCOMPR Compares contents of PS
IEBUPDTE Updates PDS
IEBDG Generates Test Datasets
IEBMOVE Copies and moves DASD data
IEBEDIT Editing datasets
IEBGENER Copies PS
SCRATCHES
UNCATALOGS
IEHLIST: 可以list PDS, CATALOG, VTOC
l AMS?
l VASM dataset之创建KSDS,KSDS 分为两部分构成index和data,因此叫做cluster,data部分叫CI,创建KSDS可以直接用JCL,指定相应的参数格式,如下:
//ddname DD DSN=dataset-name,DISP=(NEW,….)
[,UNIT=..]
[,VOL=SER=..]
[,SPACE=(unit,(pri,sec))] - unit can be CYL,TRK or record
[,AVGREC=U or K or M]
[,LRECL=..]
[,RECORG=KS or ES or RR]
[,KEYLEN=..]
[,KEYOFF=..]
l 但是更多情况下是借助AMS来创建。使用AMS,是通过调用IDCAMS program来实现的,AMS的功能很多,具体调用时,使用什么功能实在输入中指定的,其输出一般通过//SYSPRINT DD SYSOUT=*,而输入命令一般//SYSIN DD *从instream流指定。
l 常用AMS功能命令:
1. DEFINE CLUSTER:用于定义cluster,也就是用来定义VSAM dataset,使用时,分别指定三个集合参数(cluster,data,index),格式如下:
DEFINE CLUSTER ( NAME (name-of-the-cluster) -
[RECORDSIZE (avg,max)] -
[CISZ (size)] -
[KEYS (length offset)] -
[CYLINDERS/KILOBYTES… (pri,sec)]-
[VOLUMES (vol-ser)]-
[DATA( NAME (name-of-the-data-component))-
[CYLINDERS/KILOBYTES… (pri,sec)]-
[VOLUMES (vol-ser)] ]-
[INDEX ( NAME (name-of-the-index-component))]
2. REPRO: 用于复制VSAM或者NON-VSAM数据集。他是同类型之间的复制,也就是VSAM<->VSAM, NON-VSAM<->NON-VSAM. 当然也就可以PDS的member到ps了。具体格式:
000200 //STEP1 EXEC PGM=IDCAMS
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSIN DD *
000410 REPRO - -
000500 IDS(INF6244.INPUT.JCLPS1) -
000600 ODS(INF6244.VSAM.KSDS1)
000700 /*
3. LISTCAT: 列出所有catalog information,具体格式如下:
000200 //STEP1 EXEC PGM=IDCAMS
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSIN DD *
000500 LISTCAT ENTRY(INF6244.VSAM.KSDS1) ALL
000600 /*
4. Delete:删除dataset,具体格式如下:
000200 //STEP1 EXEC PGM=IDCAMS
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSIN DD *
000500 DELETE INF6244.VSAM.KSDS1
001106 /*
5. 创建GDG: 即是一系列按年代排序或者功能相关的dataset。一个GDG有三部分构成: BASE ENTRY; MODEL DATASET; GENERATION DATASET(GDS),因此创建一个GDG也要分别创建这三部分。
1. 创建BASE ENTRY: 顾名思义,即是GDG的入口,一旦BASE ENTRY被创建,以后的generation的名字只需要在其名字之上加(+1),比如,base entry的名字为:INF6244.PAYROLL.VERSION,则以后创建genertion dataset的时候名字为INF6244.PAYROLL.VERSION(+1)。格式如下:
000200 //STEP1 EXEC PGM=IDCAMS
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSIN DD *
000500 DEFINE GDG -
000600 ( NAME(INF6244.PAYROLL.VERSION) -
000700 LIMIT(12) -
000800 NOEMPTY -
000900 SCRATCH )
001000 /*
2. 创建model dataset:它的创建是为GDG提供DCB,EXPDT参数的值的,使用创建的model dataset是在创建GDS时,DCB的值就直接指定为model dataset的名字,其格式如下:
000100 //INF62441 JOB (AMLAN),NOTIFY=INF6244,CLASS=A
000200 //STEP1 EXEC PGM=IEFBR14
000600 //DD1 DD DSN=INF6244.PAYROLL,DISP=(,KEEP),
000700 // SPACE=(TRK,(5,2)),VOL=SER=,UNIT=SYSDA,
000800 // DCB=(RECFM=FB,LRECL=80,BLKSIZE=800)
3. 创建GDS:即是创建一代。格式如下:
000100 //INF62441 JOB (AMLAN),NOTIFY=INF6244,CLASS=A
000200 //STEP1 EXEC PGM=IEFBR14
000300//DD1 DD DSN=INF6244.PAYROLL.VERSION(+1),DISP=(NEW,CATLG),
000400 // SPACE=(TRK,(1,1)),VOL=SER=,UNIT=SYSDA,
000500 // DCB=INF6244.PAYROLL
4. 关于GDS的其他三个操作:
1. 删除MODEL DATASET: DELETE 后指定model ds的名字,后加pure
000200 //STEP1 EXEC PGM=IDCAMS
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSIN DD *
000500 DELETE INF6244.PAYROLL PURGE
000600 /*
2. 删除GDG和所有的GDS, 在delete之后指定GDG base entry name
000200 //STEP1 EXEC PGM=IDCAMS
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSIN DD *
000500 DELETE INF6244.PAYROLL.VERSION PURGE FORCE
000600 /*
3. 列出GDG的catalog 信息
000200 //STEP1 EXEC PGM=IDCAMS
000300 //SYSPRINT DD SYSOUT=*
000400 //SYSIN DD *
000500 LISTCAT GDG ENTRIES(INF6244.PAYROLL.VERSION)ALL
000600 /*
l SMS: 即存贮管理子系统。他是mvs中可选的管理磁盘空间的有效工具。使用SMS创建数据集的时候,再一般jcl创建语句中做如下修改即可:NNIT->STORCLAS;CB&SPACE->DATACLAS;MGMTCLAS or migration of datasets