首页 JCL 帮助文档

JCL 帮助文档

举报
开通vip

JCL 帮助文档JCL 帮助文档 1) 日记一 登陆:TSO 帐号 解禁键盘: left ctrl [创建数据集][SDS:顺序数据集 ;PDS:分区数据集(必须拥有成员才能访问。数据集名+(成员名):有则打开,无则创建。)] 进入3.2 输入dataset name :'st018.sds.data' [加单引号:不让系统自动命名前缀(PREFIX功能)] option: a (不只是这里,Mainframe里很多操作都要设置好option的选项才能回车) 输入数据集相关信息 ps.{ if (data set=...

JCL 帮助文档
JCL 帮助文档 1) 日记一 登陆:TSO 帐号 解禁键盘: left ctrl [创建数据集][SDS:顺序数据集 ;PDS:分区数据集(必须拥有成员才能访问。数据集名+(成员名):有则打开,无则创建。)] 进入3.2 输入dataset name :'st018.sds.data' [加单引号:不让系统自动命名前缀(PREFIX功能)] option: a (不只是这里,Mainframe里很多操作都要设置好option的选项才能回车) 输入数据集相关信息 ps.{ if (data set==SDS) then directory blocks=0; else if(data set==PDS) then directory blocks=1; end if; } [编辑数据集] 主命令: CANCEL:取消所做的编辑并退出编辑环境; CAPS ON/OFF:退出编辑环境后系统自动将所有字母转换为大写/小写。 CHANGE(RCHANGE):替换字符,RCHANGE表示重复上次的替换。格式:CHANGE ** ** [ALL] FIND(RFIND):查找字符串。 RECOVERY ON/OFF:设置编辑方式,ON表示用户可以通过UNDO命令取消上一次编辑操作。 RESET:重置编辑器,清除不需要的信息。 SAVE:保存当前修改,并继续编辑。 SORT:对文档行按字典顺序排序。 SUBMIT:提交作业;若作业是一段JCL程序,则通过该命令可以提交作业程序。 UNDO:取消上一次编辑(仅当在RECOVERY ON编辑方式下) CREATE:用行命令确定一个拷贝区域,通过该命令将拷贝区域保存于一个新建的数据集中去。 COPY:用行命令确定拷贝区域,通过该命令将拷贝区域复制到指定位置。 REFRESH:刷新 s(setup)+member:创建新成员(PDS) 行命令: C、CC、Cxx:拷贝命令。与其他行命令(A、B)或主命令结合使用。C 拷贝当前行,CC拷贝多行,用两个CC来定位,Cxx拷贝多行,XX表示行数。 I、IXX:插入命令。执行一次插入命令后,可直接按回车(ctrl)换行。 D、DD、Dxx:删除。 R、RR、Rxx:复制。 A:定位于当前行之前。 B:定位于当前行之后。 X、XX、Xxx:隐藏。 S、Sxx:显示隐藏的内容。 COLS:屏幕的刻度标尺。 UC、UCxx:转换成大写 LC、LCxx:转换成小写 (, (xx:将当前行左移一列或xx列。 ), )xx :将当前行右移一列或xx列。 TS:将一行文本切分为两行。 TF:将多行文本合并为一行。 [主机和PC的文件传输] 1、文件上传到主机的TSO卷上,而非USER卷。 2、下载的文件名可以是相对文件名也可以是绝对文件名 3、必须进入操作界面6 4、用PCom提供的工具,可以直接在PC和主机间对选择的区域进行复制、粘贴。不过, 操作范围只局限当前屏幕。 [给其他用户发送消息] 1、进入6(COMMAND)操作界面 2、指令格式: send '发送内容'user(用户ID) PS: 用户ID=* 的话,即表示消息广播 2) 日记二 作业控制语言JCL(类似UNIX下的shell语言)是批处理作业的用户与操作系统的接口 。 作业(作业步1,作业步2,„„,作业步n),作业步1„„作业步n是顺序执行的 。 作业由以下三步组成: (1)、编译 (2)、连接编辑(3)、执行 JCL语句的分类: [基本语句] (必须以“//”开头) 1、作业语句(JOB):标识一个作业的开始,提供必要的运行参数。 2、执行语句(EXEC):标识一个作业步的开始,定义本作业步所要执行的程序或过程。 3、数据定义语句(DD):描述应用程序所需要的数据文件。 [附加语句] 4、/*:流内数据结束或调用JES控制语句。 5、//*:注释语句,注释内容写在第4列到第80列。 6、PROC:流内过程或编目过程的起始标记。 7、PEND:标志一个流内过程的结束。 8、Command:在输入流中写入操作命令。 JCL语法规则: [JCL字符集] 26个大写字母+10个数字+10个特殊字符+6个通配符+EBCDIC可打印字符集(X‘40’~X’FE‘) 其中,特殊字符的相关说明如下: ",": 分隔参数、分隔子参数JOB (2000,100,300),GOND=(9,LT) "=":分隔关键字参数与它的值CLASS=A "(b)":括起子参数列表或PDS、PDSE的成员名 "&" :标志一个符号参数&LIB "&&": 标志一个临时数据集命&&TEMPDS标志一个流内或系统输出数据集命&&PAYOUT "." : 分隔受限数据集名字的各个部分ST018.PDS.DATA 分隔一些特定参数与子参数的各部分nodename.userid "*" : 提及一条先前的语句 OUTPUT=*.name在特定语句内标志特定功能//ddname DD* " ' ":括起含有特殊字符的参数值william'lin应该转换为'william''lin' "(空格)":划分域 [JCL语句格式规范] 语句80列:标识符区(//或/*或//*)+名字区(1~8列)+空格+操作符区(JOB ....)+空格+参数区+说明区 需要注意的地方: 1、为免混淆,仅当参数出现时才能写说明信息. 2、参数区的书写详见下面的[参数规则] 3、JCL只允许参数区和说明区有续行。当需要续行时,在当前行的第71列前必须将某个参数或某个子参数以及参数后的逗号写完整,且下一行第1、2列为“//”,第3列为空格,续行的内容只能从第4~16列开始(16列后开始的话将被认为是注释语句的续行)。 //DATA DD DSN=SYS1。FORTLIB, // DISP=OLD 4、注意用空格来划分区域~ [JCL参数规则] 位置参数:与其他参数保持相对位置的参数 关键字参数:由一个关键字和等号后面的数据组成 1、位置参数和关键字参数之间用逗号隔开,不允许有空格,切记切记。 2、关键字参数必须写在同一级别的关键字参数之后。 3、缺省(不等于没有)某个位置参数或某个子参数时,必须用逗号指明所在位置 若缺省的是最后一个位置参数,则逗号可以省略 //EXP JOB (2000,,9),CLASS=A //SYSTEM JOB ,SYSTEM,CLASS=S,MSGLEVEL=(0,0) 4、如果没有任何位置参数,则不必书写任何内容表示//EXP JOB CLASS=A 5、含有特殊字符的参数一般要用“' ”将其括起来。其中,'用''表示,&用&&表示.... 6、位置参数和关键字参数最多只能有两级子参数。 [JCL语法实例] //EXPJOB JOB,'USERNAME',MSGLEVEL=(1,1),EXAMPLE #作业语句,EXAMPLE为注释 //MSGGLASS=Q,CLASS=A #作业语句续行 //****************** #注释语句 //*IT'S AN EXAMPLE* //****************** //STEP1 EXEC PGM=IEFBR14 #执行语句 //DD1 DD DSN=MJSN.TEAM01.ONE,DISP=(,GATLG), #DD语句 //SPACE=(TRK,(5,2)),UNIT=SYSDA #DD 语句续行 //DD1 DD DSN=MJSN.TEAM01.TWO,DISP=(,KEEP), #DD语句 //SPACE=(TRK,(1,1)),UNIT=SYSDA #DD语句续行 JOB语句: 语句格式://作业名 JOB 位置参数[,关键字参数][,关键字参数]...[注释说明] 作业名建议为USERID+数字或字符 [位置参数] 1、记帐信息:提供用户使用系统的合法性、机时及纸张收费管理等。 格式:([account-number][,accounting-information]...) account-number:用户帐号 accounting-information:附加记帐信息,如部门..等 //ST018A JOB (ST018,'6/7/2006',PGMBIN) //ST018B JOB ST018 2、程序员名:表示作业的所有者(owner)信息,长度不得超过20个字符 //ST018A JOB 2006,W.I.L.L.I.A.M //ST018B JOB 2006,WILLIAM //ST018C JOB 2006,'WILLIAM''LIN' 例子: 全部位置参数: //ST018EXP JOB (20006,60),WILLIAM,CLASS=S,.... 缺省记帐信息: //ST018EXP JOB ,WILLIAM,CLASS=S,.... 不带位置参数: //ST018EXP JOB CLASS=S,.... [关键字参数] 1、ADDRSPC:指明作业 所需之存储类型。有两个子参数:VIRT(缺省)、REAL。前者表示作业请求页式存储,后者表示作业请求实存存储空间。 2、BYTES:指明打印作业的系统输出数据集的最大千字节数,并指出当超过所为最大字节数时系统对作业的处理方式。处理方式包括:CANCEL(取消且不转储)、 DUMP(取消且转储)、WARNING(继续作业且发出警告信息)。类似BYTES(千数)的关键字参数有:CARDS(卡数)、LINES(行数)、 PAGES(页数)。 3、CLASS:规定作业的类别,JCL可选的作业类别有36个,用字母A~Z、数字0~9表示。相同类别处于同一输入队列等待执行。 4、MSGCLASS:对作业日志(job log:与作业相关信息的记录)设置输出类别。类别种类和CLASS中的类别一样。 5、MSGLEVEL:控制JCL作业输出清单的内容。格式: MSGLEVEL={[statements][,messages]}。其中,statements、messages的说明如下: statements=0:仅打印出作业的JOB语句 =1:打印出作业中包括过程语句在内的所有JCL语句 =2: 打印出输入流中的所有控制语句 messages=0:仅当作业 异常终止时,才打印出有关JCL、JES、操作员及SMS的处理信息 =1:无论作业是否异常终止,都打印出有关JCL、JES操作员及SMS的处理信息。 例如://EXMP JOB ,MSGLEVEL=(2,1) //EXMP JOB ,JSGLEVEL=0 //EXMP JOB ,MSGLEVEL=(,0) 6、NOTIFY:请求系统在后台作业处理完毕时给指定用户发信息。NOTIFY={USERID} 7、PRTY:为输入队列设置优先级。PRTY=priority。priority的取值范围:0~15(JES2)、0~14(JES3)。对于同一优先级的作业,采用FIFO的方法执行。 8、REGION:指定作业所需的实存或虚存空间的大小 REGION={valueK} ={valueM} 例子://ACCT1 JOB A23,SMITH,REGION=100K //ACCT2 JOB A23,REGION=2M 9、TIME:指定作业占用处理器的最长时间。当作业时间超过限制后,系统将终止该作业。 TIME={([minutes][,seconds])} ={1440}#无限制 ={NOLIMIT}#无限制 ={MAXIMUM}#运行时间为357912分钟 10、TYPRUN:请求特殊的作业 处理 TYPRUN={COPY}#仅支持JES2;请求JES2将输入作业流直接拷贝的输出数据集进行处理。 ={HOLD} #请求系统在执行前将其挂起,等待某特定事件发生。 ={JCLHOLD}#请求JES2在JCL执行前挂起,直到操作员将其释放。 ={SCAN}#只对作业的JCL进行语法检查,不执行也不分配设备。 EXEC语句: //[作业名] EXEC 位置参数[,关键字参数]...[符号参数=值]...[注释] [位置参数] 有两个位置参数,只能二选其一。 1、PGM:指明所要执行的程序名。该程序必须是PDS的成员或系统库、私有库及临时库的PDSE的成员。调用方法有直接调用和间接调用。 PGM={program-name} ={*.stepname.ddname} ={*.stepname.procstepname.ddname} program-name:指明要执行程序的成员名或别名,程序名由1~8个字母或通配符开头的字符数字构 成。 *.stepname.ddname:表示要执行的程序名由本作业步前名为“ stepname” 的作业步内名为 ”ddname”的DD语句的DSN参数决定。 *.stepname.procstepname.ddname:表示要执行的程序名由本作业步前名为“stepname”的作业步 里所调用过程名为“procstepname”的过程步中相应名为“ddname”DD语句的DSN参数决定。 2、PROC:指明作业步所要运行的过程名。格式如下: {RPOC=procedure-name} {procedure-name} //SP EXEC PROC=PAYWRKS //SP EXEC OPERATE procedure-name:调用的过程名可以是:编目过程的成员名或别名;由PROC语句定义的流内过程的过程名,该流内过程必须在本作业内且本作业步前定义。 [关键字参数] P.S 作用范围仅限于本作业步,总的书写格式:关键字参数[.过程步名]=值 1、ACCT:指明作业步所需懂的一个或多个记帐信息子参数.格式:ACCT[.过程步名]=(记帐信息) //STP3 EXEC PROC-=LOOKUP,ACCT=('/83468') 2、ADDRSPC:指明作业步所需之存贮类型,方法同JOB中的ADDRSPC参数. 3、REGION: 同JOB语句中的REGION 4、TIME: 同JOB中的TIME 5、COND:用于对先前作业步执行的返回码(return code)进行测试,以决定是否执行本作业步.当条件满足时(有一个满足即可)系统不执行本作业步,即跳过本作业步.格式如下: COND[.过程步名]=(code,operator) =((code,operator[,作业步名][,过程步名]) [,(code,operator[,作业步名][,过程步名])],...[,EVEN]) [,ONLY] COND=EVEN COND=ONLY 说明:最多可测试8个返回码,EVEN(ONLY)也算一个返回码的名额.code0用来与返回码的比较,取值范围0~4095。operator表示比较类型,GT(大于)、GE(大于等于)、EQ(等于)、NE(不等于)、LT(小于)、LE(小于等于)。EVEN表示无论先前作业步是否异常终止,本作业步都要执行。ONLY表示只有先前作业步异常终止时,本作业步才执行。 //STEP2 EXEC PGM=DUMPINT,COND=((16,GE),(90,LE,STEP1),ONLY) //STP4 EXEC PROC=BILLING,COND.PAID=((20,LT),EVEN), //COND.LATE=(60,GT,FIND), //COND.BILL=((20,GE),(30,LT,CHGE)) 6、PARM:用于向本作业步执行的程序传递变量信息。该程序必须有相应的指令接受这些信息。 PARM[.过程步名]=子参数 =(子参数,子参数) =('子参数',子参数) ='子参数,子参数' //RUN1 EXEC PGM=APG22,PARM='P1,123,P2=5'#将参数P1、123、P2=5传递给APG22 //STP6 EXEC PROC=ASFCLGP,PARM.LKED=(MAP,LET) #将参数MAP、LET传递到过程ASFCLG中名为LKED的过程步 DD语句: //[dd名 ] DD [位置参数][,关键字参数]...[注释] [过程步名.dd名] //[dd名 ]DD [过程步名.dd名] dd名不能与系统定义的dd名重复 [位置参数] 此三者取其一 1、*:开始一个流内数据。数据记录跟在DD语句之后,其第一、第二列不能是“//”或“/*”(因为这两个符号标记了流内数据记录的结束)。倘若数据记录需要以“//”开始,就必须以DATA参数代替*。 //INPUT1 DD * data . //INPUT2 DD ..... //STEP2EXEC PROC=FRESH //SETUP.WORK DD UNIT=3400-6,LABEL=(,NSL) //SETUP.INPUT1 DD * data /* //PRINT.FRM DD UNIT=180 //PRINT.INP DD * . data /* 注意数据集所对应的过程步名. 2、DATA:用于一个流内数据的开始,该流内数据可以含有以“//”开头的语句。数据记录以“/*”来结束。用法与“*”参数基本类似。 3、DUMMY:用于标明(1)没有设备或外存空间分配给该数据集(2)对该数据集不进行状态处理(3)对BSAM或QSAM来说,不对该数据集作输入输出操作。 //OUTDD1 DD DUMMY,DSNAME=X.X.Z,UNIT=3380,SPACE=(TRK,(10,2)),DISP=(,CATLG) 该DD语句定义了一个空数据集.该语句出DUMMY以外的参数将接受系统语法检查但并不起作用. [关键字参数] 总的可分为两类,一类是与设备相关的,另一类是与数据集或数据相关。 1、UNIT:用于请求物理设备 {UNIT=([三位设备地址][,设备数][,DEFER])} [/三位设备地址][,P] [/四位设备地址][,] [设备类型] [设备组名] {UNIT=AFF=DD名} 设备地址:通过设备地址指定设备. 设备类型:通过设备类型指定设备,这个名称通常是数字.比如通过3480、3422指定磁带机,3340、3375、3380、3390指定磁盘机。 设备组名:通过设备组名请求一台或一组设备.组名有1~8个字母符号构成,常见的有SYSDA、DASD、TAPE、CART等。如果需要直接访问的存储设备时,参数可以设置为:UNIT=DASD。 设备数:所需设备数量,1~59取值. 例子: //STEP2 EXEC PGM=POINT //DDX DD DSNAME=EST,DISP=MOD, // VOLUME=SER=USER01, // UNIT=(3390,2) //DDY DD DSNAME=ERAS,DISP=OLD,UNIT=3390 //DDZ DD DSNAME=RECK,DISP=OLD, // VOLUME=SER=USER01,UNIT=AFF=DDX //DD3 DD DSNAME=COLLECT, // DISP=OLD, // VOLUME=SER=1095, // UNIT=(3490,,DEFER) DDX请求分配两个3390设备,DDZ申请分配与DDX相同的 两个设备,DDY申请分配一个3480设备。DD3所请求的磁带卷只到数据集 被打开时才会装载。 2、VOLUME:指定所引用(或者是新建)数据集所在的卷或卷组。在使用这个参数时,用户可以指定一个特定的卷、一组卷、具有特定序列号的卷或另外一个数据集所使用的卷。对于一个跨越多个卷的数据集来说,这个参数还可以用来指定首先被处理的卷。对于一个新建的数据集来说,可以通过不指定VOLUME参数或在VOLUME参数中不指定SER和REF子参数的方法在任何一个卷或卷组上创建该数据集,我们称这种方法为非特定卷。 {VOLUME}=([PRIVATE][,RETAIN][,卷顺序号][,卷数]) VOL =[,][, ] [SER=序列号] [SER=(序列号[,序列号]...) ] [,] [REF=数据集名] [REF=*.DD名] [REF=*.作业步名.DD名] [REF=*.作业步名.过程作业步名. DD名] PRIVATE:申请一个私有的卷。这里的私有卷是指: (1)除非使用VOLUME=SER子参数明确地请求这个卷,否则系统不会在这个卷上分配输出数据集。 (2)对于一个磁带卷来说,除非指定了RETAIN子参数或在DISP参数中指定PASS,否则这个磁带卷将会在数据集关闭后被卸载。 (3)对于一个可卸载的直接访问卷来说,这个卷将在数据集关闭后被卸载。 RETAIN:对于一个私有磁带卷来说,指定RETAIN子参数表示在数据集关闭后或在作业步结束后,这个卷不会被卸载;对于一个公共磁带卷来说,如果这个卷在作业中被卸载,它将保留在相应的设备上。 卷顺序号:用来在一个多卷的数据集中确定开始处理的卷。卷顺序号为1~255的十进制数,第一个 卷的顺序号为1,卷的顺序号必须小于等于数据集所占用的实际卷数,否则作业将会失败。如果不指定卷顺序号,则系统从1开始处理。对于一个新数据集系统将忽略所指定的卷顺序号。 卷数:用来确定一个输出数据集所申请的卷的最大数量。卷数为1~255的一个十进制数,在一个作业步中所有的DD语句中的卷数总和不能超过4095。 SER :通过卷的序列号用来确定数据集占用或将占用那些卷。一个卷的序列号为1~6个字符,可以包含字母、数字和$、#、@等特殊字符。不足6位的序列号将被空格填满。在一条DD语句中最多可以指定255个卷序列号。不要在一个SER子参数中指定重复的序列号,无论是磁带卷还是磁盘卷,每个卷都应该有唯一的卷序列号。不要将序列号指定为SCRTCH、PRIVAT或Lnnnnn(L后有五个数字),这些名字已经被用在请求操作员装载卷的消息中;不要将序列号指定为MIGRAT,这个名字被DFHSM Data FacilityHierarchical Storage Manager) 用来做数据集的移植。 REF:用来表示系统将从其它的数据集或前面的DD语句中获得卷序列号的信息。 例子: //OUTDD DD DSNAME=TEST.TWO,DISP=(NEW,CATLG), //VOLUME=(,,,3,SER=(333001,333002,333003)), //SPACE=(TRK,(9,10)),UNIT=(3330,P) //NEXT DD DSNAME=TEST.TWO,DISP=(OLD,DELETE) // //STEP1 EXEC PGM=.... //DD1 DD DSN=OLD.SMS.DATASET,DISP=SHR //DD2 DD DSN=FIRST,DISP=(NEW,CATLG,DELETE),VOL=REF=*.STEP1.DD1 3、SPACE:为新建数据集分配磁盘空间,对于磁带卷不起作用。请求空间分配一般有两种方法:一是告知系统所需空间大小,由系统来分配合适的空间;二是请求系统分配某个特定的空间,如:从某个特定磁道到另一个特定磁道。 当用第一种方法时,用户告诉系统所要分配空间的存贮单位及存贮空间单位的数量。存贮单位可以是磁道(TRK)、柱面(CYL)、块长及记录长。不同类型的磁盘设备其磁道、柱面容量也不同,所以为数据集分配空间时,要清楚用户所用的设备类型及磁道、柱面的容量。 格式(由系统分配空间): SPACE=({TRK,}(初次分配数量[,再次分配数量][,目录空间])[,RLSE][,CONTIG][,ROUND]) ({CYL,}[,][,索引][,][,MXIG ]) ({块长度, }[,ALX ] ({记录长度,}[, ] Notes:SPACE的子参数均为位置参数 说明: TRK:表示系统以磁道为单位分配空间。 CYL:表示系统以柱面为单位分配空间。 块长度:用来指定数据的平均块长度(字节),块长度是0~65535的一个十进制数,这里指定的块长度用来作为空间分配的单位。 记录长度:在SMS环境下用来指定数据的平均记录长度(字节),记录长度是0~65535的一个十进制数。这里指定的字节数用来作为空间分配的单位。当记录长为0时,将不对存储空间进行分配。 初次分配数量:初次为数据集分配的空间的大小,单位为磁道、柱面等。如果使用TRK或CYL作为单位为一个分区数据集分配空间,则初次分配的空间包含了目录空间;如果使用块长度或记录长度作为单位为一个分区数据集分配空间,则初次分配的空间不包含目录空间,系统另外分配目录空间。所要求的卷必须有足够的空间用于初次分配,否则作业将失败。 再次分配数量:当初始量指定的空间大小不能满足需要时,系统会根据追加量为用户分配附加的存储空间。这种分配是动态分配,所以空间可以不连续,最多可以追加15次。 目录空间:用于指定分区数据集目录区的空间大小,以256字节为块单位进行分配,每个块长可以包含5个成员名。索引:对于一个索引顺序数据集的索引来说,用来指定索引区所需的空间,以磁道或柱面为单位,指定的磁道数应该等于一个或多个柱面。 RLSE:表示在数据集关闭时,那些分配给数据集但没有被使用的空间将会被释放。前提条件是数据集必须为了输出被打开并且最后一个操作为写操作。 CONTIG:指定分配给数据集的空间必须是连续的,这个子参数仅仅影响初次分配。 ROUND:当存储单位为“块长度”时,表示分配的空间必须等于整数柱面,其它情况下忽略这个子参数。 MXIG:要求为数据集分配的空间必须1.是卷上最大的连续空间;2.大于或等于初次分配的空间大小。这个子参数仅仅影响初次分配。 ALX:作业在分配空间时将获得卷上最多5个最大的连续空间,并且每一个空间都应大于或等于初次分配的空间大小。这个子参数仅仅影响初次分配。 格式(申请特定的磁道): SPACE=(ABSTR,(初次分配数量,地址[,目录空间])) [,索引] 格式:仅请求目录空间: SPACE=(,(,,目录空间)) 说明(申请特定磁道): ABSTR:表示将在卷上特定的位置为数据集分配空间。初次分配数量:指定为数据集分配的磁道数,要求卷上必须有足够的空间。地址:指定分配的第一个磁道的磁道号,第一个柱面上第一个磁道的磁道号为0。 例子: //DD2 DD DSNAME=PDS12,DISP=(,KEEP), // UNIT=3350, // VOLUME=SER=25143, // SPACE=(CYL,(10,1,10),,CONTIG) 在DD语句中定义了一个新的分区数据集,系统将为这个数据集分配10个柱面,其中创建10个256字节的记录作为目录。由于指定了CONTIG子参数,系统将在卷上为数据集分配10个连续的柱面. //REQUEST1 DD // DSNAME=EXM,DISP=NEW, // UNIT=3330,VOLUME=SER=606674, // SPACE=(1024,75),DCB=KEYLEN=8 在本例的DD语句中根据块长分配空间,数据的平均块长为1024字节,需要申请75个数据块,每一个数据块前都需要有一个8个字节长的键,系统将会根据UNIT参数指定的设备计 算需要多少个磁道。 下面我们以3380磁盘为例,来看看space参数的使用情况,计算我们实际分配给数据集的空间大小:例1:Space,(CYL,3)3*15*47476=2136420字节 例2:Space,(TRK,3)3*47476=142428字节 例3:Space,(800,300)800*300=240000字节 Primary quantity . . 10 初始给10Space units Secondary quantity 10 不够用每次扩展10Space units,有一定次数,一般15次吧 Directory blocks . . 10 一个blocks可以有5个member,这个就是一共可以有50个memebers Record format . . . . FB 格式是fix block Record length . . . . 80 每条record 长80 Block size . . . . . 8000 一个blcok 是8000,需要时record length的整数倍,关系效率问题,但是有个最大值 1 CYL=15TRK 1TRK=47476KB 4、DISP:向系统描述数据集的状态,并且可以设定系统在作业步或作业结束时如何处理相应的数据集。 格式: {DISP=状态} {DISP=([状态][,正常结束参数][,非正常结束参数])} DISP= ([NEW] [,DELETE ] [,DELETE ]) [OLD][,KEEP ][,KEEP ] [SHR][,PASS ][,CATLG ] [MOD] [,CATLG ][,UNCATLG] [, ][,UNCATLG] [,] Notes:所有的子参数均为位置参数。 状态参数说明: NEW—表示在当前作业步中创建一个新的数据集。 OLD—表示该数据集在当前作业步运行之前已经存在,并且当前作业步将以独占的方式使用这个数据集。 SHR—表示该数据集在当前作业步运行之前已经存在,并且当前作业步将以共享的方式使用这个数据集,也就是说其它的作业也可以同时使用这个数据集。这个参数值也可以写成SHARE。 MOD—表示下列两种情况之一:1.数据集已经存在,记录将被添加到数据集的结尾,这个数据集必须是顺序的;2.一个新的数据集将被创建,在任何一种情况下数据集都将以独占的方式被使用 正常结束参数说明: DELETE—表示在作业步正常结束后,该数据集将不再需要而被删除,所占用的空间将会被释放。KEEP—表示在作业步正常结束后,该数据集仍将继续保留在相应的卷上,它是缺省值。 PASS—表示该数据集将会被保留传递到同一作业的后续作业步中被使用。 CATLG—在作业步正常结束后,系统将对数据集进行编目,在系统编目或用户编目中设置相应的入口指针指向该数据集。 UNCATLG—在作业步正常结束后,系统解除对数据集的编目,在系统编目或用户编目中删除相应的入口指针和索引。 •DISP参数缺省: •NO DISP : DISP=(NEW,DELETE,DELETE) •DISP=OLD : DISP=(OLD,KEEP,KEEP) •DISP=(,CATLG): DISP=(NEW,CATLG,CATLG) •DISP=NEW : DISP=(NEW,DELETE,DELETE) •DISP=SHR : DISP=(SHR,KEEP,KEEP) •DISP=MOD : DISP=(MOD,KEEP,KEEP) 例子: DISP//IXSAMP06 JOB ‘MZ’,’GZ’,… //… //STEP0X EXEC PGM=PROGRAM1,PARM=(…,…) //DS1 DD DSN=TE02.DS1,DISP=NEW 这里把DISP,NEW相当于DISP=(NEW,DELETE,DELETE)。也就是说当作业步第一次访问这个数据集的时候,系统会试图创建这个数据集,如果作业步正常结束或者不正常结束则删除该数据集 5、DCB:数据控制块参数,用于描述数据集的属性特征,包括记录长度,格式和记录块大小等,新建数据集时必须设置该参数。 格式: [ DCB=(子参数[,子参数]...)] [ DCB= ( {数据集名}[,子参数]...)] [( {*.DD语句名})] [( {*.作业步名.DD语句名})] [( {*.作业步名.过程作业步名.DD语句名})] 子参数介绍: RECFM:用于指定记录格式。 RECFM=FB(定长组块记录)F (定长不组块记录)VB(变长组块记录)V (变长不组块记录) LRECL:用于指定数据集的记录长度。LRECL=bytes对于定长记录,LRECL的值为实际记录的长度;对于变长记录,LRECL的值为最大记录长加上4个字节的控制信息。 BLKSIZE:指定数据集记录块的大小。BLKSIZE=bytes最大的块长为32K,对于定长组块记录,BLKSIZE的值必须是LRECL的整数倍。对于变长组块记录,情况复杂一些,要多8个字节的控制信息。 例1//DD1 DD DSNAME=ALP,DISP=(,KEEP),// VOLUME=SER=44321, UNIT=3400-6,// DCB=(RECFM=FB,LRECL=240,BLKSIZE=960)DD语句DD1中定义了一个名为ALP的新的数据集。在DCB参数中包含了用以完成数据控制块的必要信息。 例: //DD4 DD DSNAME=JST, // DISP=(NEW,KEEP),UNIT=SYSDA, // SPACE=(CYL,(12,2)),DCB=(A.B.C,KEYLEN=8) DD语句DD4中定义了一个名为JST的新的数据集,并且要求系统参照一个已编目的数据集A.B.C的DCB信息来确定本语句中的DCB参数的值,通过指定子参数KEYLEN来将相应的定义覆盖。 6、SYSOUT:通过SYSOUT参数可以将相应的数据集标志为一个系统输出数据集,同时SYSOUT参数还可以完成以下的定义:(1)将这个系统输出数据集与一个输出类关联起来; (2)不通过JES而是要求一个外部的书写器程序来处理这个系统输出数据集;(3)指定这个数据集被打印输出的格式;(4)引用JES2的 /*OUTPUT语句。 系统输出数据集根据下面的输出定义顺序被处理:(1)在SYSOUT DD语句中指定的选项;(2)参考JCL的OUTPUT语句中指定的选项;(3)参考JES2的/*OUTPUT语句中指定的选项或(4)JES3的 //*FORMAT语句中指定的选项;(5)相关的输出类的缺省值。 格式: SYSOUT= { 输出类} { * } { ([输出类] [,书写器名] [,格式名]) } [,INTRDR ] [,代码名] SYSOUT=(,) 说明: 输出类:为数据集指定的输出类,输出类为一个字符:A~Z或0~9。 *—表示输出类与在JOB语句中MSGCLASS参数的定义相同。 (,)—指定输出类为空值。当引用JCL的OUTPUT语句中CLASS参数的定义时必须指定输出类为空值 书写器名:确定一个系统书写器程序的名字(1~8个字符)。一个外部书写器程序是系统中一个用来处理输出的已启动的任务,每一个外部书写器程序有一个用户标识符与其相关联。通过在DD语句中指定外部书写器的名字来使用该书写器程序处理输出。(晕。。。。。) NTRDR:通知JES将这个系统输出数据集作为输入作业流送到内部读卡机。 格式名:确定打印输出的格式,格式名为1~4个字符,可以为字母、数字或特殊字符($、#、@)。 代码名:用来确定JES2获得处理属性的JES2 /*OUTPUT语句,代码名必须与JES2的/*OUTPUT语句中的CODE参数相同。代码名仅仅被JES2系统支持,当作业或作业步中包含了一个缺省的JCL OUTPUT语句时不要使用代码名。 例: //DD5 DD SYSOUT=(F, ,2PRT) 在本例的DD语句中指定JES将系统输出数据集写到处理F类输出的设备上,数据集将会按照名为2PRT的输出格式被打印。 7、SYSIN:通常,我们使用SYSIN DD语句作为一个内部流数据集的开始。内部流数据集以DD *或DD DATA语句开头,这样的DD语句可以有任何一个有效的名字,包括SYSIN。如果在内部流数据之前省略这样的DD语句,系统会自动提供一个名为SYSIN的DD *语句。 格式: //SYSIN DD 参数[,参数]... [说明] 说明:第一个参数为*或DATA,用以指出后面紧跟的是内部流数据。这条语句必须且只能够位于内部流数据前。 8、DSNAME:指定一个数据集的名字,该数据集可以是已经存在,或者是新建的。 格式:{DSNAME}=名字 {DSN} 如果是新建的数据集的话,一般后面要跟相关的关键字参数:DISP,SPACE,UNIT,VOLUME,DCB。如果是已经存在的数据集,则后面一般跟DISP。 9、JOBCAT: 通过DD语句JOBCAT可以为作业定义一个私有的VSAM用户编目或完整的编目功能。系统可以在搜索主编目或搜索与数据集名的第一部分相关联的私有编目前先搜索本语句中定 义的私有编目。 当作业中引用了一个SMS数据集时不要使用JOBCAT语句,因为SMS仅仅访问那些在系统编目中进行编目的SMS数据集。 格式: //JOBCAT DD DISP={OLD}, // DSNAME=私有编目名[,参数]... [说明] {SHR} 说明: 不要指定任何UNIT和VOLUME参数,系统将会从主编目中获取私有编目的位置。 可以通过在JOBCAT语句后立即跟有省略了语句名的DD语句的方法为作业指定多个这样的私有编目。应当将JOBCAT语句放置在JOB语句之后,并且位于第一个EXEC语句之前。 如果作业中包含了JOBLIB语句,应当放置在JOBCAT语句之前。 //EXAMPLE JOB WILLIAMS,MSGLEVEL=1 //JOBLIB DD DSNAME=USER.LIB,DISP=SHR //JOBCAT DD DSNAME=LYLE,DISP=SHR //STEP1 EXEC PGM=SCAN 在这个例子中,JOBCAT语句指定了一个私有编目LYLE,并且JOBCAT语句位于JOBLIB语句之后。 10、JOBLIB:通过JOBLIB DD语句用户可以创建一个私有库或为作业指定一个私有库。系统将会首先搜索所指定的私有库去查找那些在EXEC语句的PGM参数中使用的程序,只有在私有库中没发现相匹配的程序时系统才会去搜索系统库。 一个私有库实际上是一个位于一个直接访问设备上的分区数据集(PDS)或分区数据集扩展(PDSE),其中的每一个成员都是一个用户的可执行程序。 格式://JOBLIB DD 参数[,参数]... [参数] 说明: 定义已编目的库:指定DSNAME参数;指定DISP参数,其中的状态子参数必须为OLD或SHR;不需要指定VOLUME或UNIT参数。 定义未编目的库:指定DSNAME参数;指定DISP参数,参数值必须为DISP=(OLD,PASS)或DISP=(SHR,PASS);其中SHR表示这个数据集是已经存在的并允许其它作业使用这个库;指定UNIT参数;指定VOLUME参数。 创建一个库:指定DSNAME参数,作为库的名字;指定UNIT参数,注意一个库必须建立在一个直接访问设备上;指定VOLUME参数,非特定卷的情况例外;指定SPACE参数,为整个库分配足够的空间,并为PDS的目录分配空间;指定DISP参数,其中的状态子参数必须为NEW。 向库中添加成员:DSNAME参数包含相应的成员名,例如,DSNAME=LIBRARY(PROGRAM);将DISP参数中的状态子参数指定为MOD,如果在创建库时已经编目则不需要其它子参数,否则指定为PASS或CATLG;不要指定SPACE参数。其它参数:如果在数据集标签中不包含数据控制块信息则需要指定相应的DCB参数,但不要指定FREE=CLOSE。 例1 //PAYROLL JOB JONES,CLASS=C //JOBLIB DD DSNAME=PRIVATE.LIB4, // DISP=(OLD,PASS) //STEP1 EXEC PGM=SCAN //STEP2 EXEC PGM=UPDATE //DD1 DD DSNAME=*.JOBLIB, // DISP=(OLD,PASS) 在本例中JOBLIB DD语句中所指定的私有库已经被编目,所以无需指定UNIT和VOLUME参数。系统首先搜索私有库PRIVATE.LIB4去查找程序SCAN和 UPDATE,其次才查找系统库SYS1.LINKLIB。在DD1语句中引用了JOBLIB DD语句中指定的私有库。 例2 //PAYROLL JOB FOWLER,CLASS=L //JOBLIB DD DSNAME=PRIV.DEPT58, // DISP=(OLD,PASS), // UNIT=3350,VOLUME=SER=D58PVL //STEP1 EXEC PGM=DAY //STEP2 EXEC PGM=BENEFITS //DD1 DD DSNAME=*.JOBLIB, // VOLUME=REF=*.JOBLIB,DISP=(OLD,PASS) 因为在本例中JOBLIB DD语句中所指定的私有库没有被编目,所以必须指定UNIT和VOLUME参数。系统首先搜索私有库PRIV.DEPT58去查找程序DAY和 BENEFITS,其次才查找系统库SYS1.LINKLIB。在DD1语句中引用了JOBLIB DD语句中指定的私有库。 例4 //PAYROLL JOB BIRDSALL,TIME=1440 //JOBLIB DD DSNAME=KRG.LIB12, // DISP=(OLD,PASS) // DD DSNAME=GROUP31.TEST, // DISP=(OLD,PASS) // DD DSNAME=PGMSLIB,UNIT=3350, // DISP=(OLD,PASS),VOLUME=SER=34568 通过三个DD语句为作业定义了三个相连接的私有库,系统将按照下面的顺序查找每一个程序:KRG.LIB12;GROUP31.TEST;PGMSLIB;SYS1.LINKLIB。 11、STEPCAT:通过DD语句STEPCAT可以为作业步定义一个私有的VSAM用户编目或完整的编目功能。系统可以在搜索主编目或搜索与数据集名的第一部分相关联的私有编目前先搜索本语句中定义的私有编目。 当作业步中引用了一个SMS数据集时不要使用STEPCAT语句,因为SMS仅仅访问那些在系统编目中进行编目的SMS数据集。 格式 //STEPCAT DD DISP={OLD}, // DSNAME=私有编目名[,参数]... [说明] {SHR} 说明: 不要指定任何UNIT和VOLUME参数,系统将会从主编目中获取私有编目的位置。可以通过在STEPCAT语句后立即跟有省略了语句名的DD语句的方法为作业指定多个这样的私有编目。通过下面的语句可以在一个特定的作业步中用主编目覆盖JOBCAT中定义的私有编目://STEPCAT DD DISP=OLD,DSNAME=主编目名。在一个作业步中可以将STEPCAT语句放在DD语句中的任何一个位置。 //STEP2 EXEC PROC=SNZ12 //STEPCAT DD //DSNAME=BETTGER,DISP=SHR STEPCAT语句为这个作业步定义了一个私有编目BETTGER。 12、STEPLIB:STEPLIB 语句的作用与JOBLIB相似,主要区别在于作用的范围分别是作业步和作业。同一个作业中后续作业步可以引用在STEPLIB DD语句中定义的私有库,同样,可以将一个STEPLIB DD语句放在内部流或编目过程中,但不能将JOBLIB DD语句放在内部流或编目过程中。 格式: //STEPLIB DD 参数[,参数]... [说明] 13、IF-THEN-ELSE-ENDIF:条件语句 //IXSAMP23 JOB ‘AC’,’GZ’,CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1), //… //STEP01 EXEC PGM=PROGRAM1, PARM=(10,’2008-01-29’) //… //TESTSTEP IF (STEP01.RC = 8) THEN //STEP0X EXEC PGM=PROGRAMX //… // ELSE //STEP0Y EXEC PGM=PROGRAMY //… // ENDIF 如果作业步STEP01的执行返回码为8,那么条件为真,执行作业步STEP0X,否则执行作业步STEP0Y 3) 日记三 实用程序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:是转储或再存储直接存取卷数据应用程序。 3、IDCAMS:首先判断一个dataset是否存在,如果存在则把它删除,再create一个新的dataset。 实用程序的调用: • 实用程序的调用方法有两种, 一种是在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) [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 PRINT 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。 4) 日记四 [基本概念] 过程:过程是一段预先编写好的JCL语句的集合,它可以被反复调用.包括编目过程和流内过程. 编目过程:在指定的过程库中编目的过程.该过程库可以是分区数据集或扩展分区数据集,通常系统过程被编目在系统过程库,用户过程被编目在用户过程库.由于调用编目过程时,系统所提供的是该过程的拷贝,所以一个编目过程可以同时被几个作业调用. 流内过程: 放置在作业输入流中的过程. 在一个作业中最多可以有15个流内过程. 不能嵌套使用,也不能被其他作业调用.流内过程和编目过程不同,前者随着一个作业放在输入流中,紧跟在JOB语句之后. 一般而言,流内过程只用于测试阶段,一旦测试通过,即可对其进行编目,即转变为编目过程. [流内过程] //R123 JOB (456),”SMITH”,CLASS=A#这行 very重要 ,不可漏掉 //RUN PROC# 开始定义一个过程, 此句必须紧跟在JOB语句后面 //GO EXEC PGM=ONE //SYSOUT DD SYSOUT=A // PEND# 标志一个流内过程的结束(编目过程不需要此句) //STEP1 EXEC RUN#调用RUN这个流内过程 [编目过程] 该编目过程存放在ST018.PDS.LIB(PROC1)里面 //RUN PROC# 开始定义一个过程, 此句必须紧跟在JOB语句后面 //GO EXEC PGM=ONE //SYSOUT DD SYSOUT=A 调用该编目过程的JCL语句写在另外一个文件 //MYJOB JOB .... //MYLIB JCLLIB ORDER=ST018.PDS.LIB#此步非常之重要,定义一个Private LIB, //STP1 EXEC PROC=PROC1#开始调用,注意:过程名不是RUN,而是PROC1,即成员名 过程的修改: [修改DD语句] //INVOKE EXECTRANSACT //procstepname.ddname DD parameter=value 说明: if(procstepname.ddname 不在 parameter.procstepname中) { 新增DD语句ddname } else { if(parameter存在于过程中) then 覆盖原来parameter 的值 if(parameter不存在于过程中)then 新增参数 if(value==' ') then 还原参数parameter的默认值 if(被调用过程中存在不是parameter的参数)then 保留那些参数值 } 若要使得DD语句无效,请参照下面格式 //PROCSTEPNAME.DDNAME DD DUMMY 或者 //PROCSTEPNAME.DDNAME DD DSN=NULLFILE 特别提醒: 该做法对BCD参数无效. 如果要连BCD也作用的话, 看下面的格式: This is a DD statement in a procedure called PSTEP1: //DD3 DD DSN=MYDSET,DISP=SHR, // DCB=(RECFM=FB, // BLKSIZE=160,LRECL=80) In order to nullify the entire DCB parameter of the DD statement, each DCB keyword subparameter specifiedin the procedure definition must be nullified as shown below: //PSTEP1.DD3 DD DCB=(RECFM=,BLKSIZE=,LRECL=) [修改EXEC语句] //STEPNAME EXEC TRANSACT,PARAMETER.STEPNAME=VALUE 其他的与修改DD语句基本相同.不再累述. [使用符号参数] 定义符号参数(必须在过程中定义): //.........,parameter=&A#A是符号 赋值符号参数: 方法一 TRANSACT definition: //PSTEP1 EXEC PGM=PROG1, // ACCT=&DEPT1 //PSTEP2 EXEC PGM=PROG2, // ACCT=&DEPT2 Assigning values to &DEPT: //JSTEP EXEC TRANSACT, // DEPT1=GRP50, // DEPT2=GRP100 方法二 TRANSACT definition: //PSTEP1 EXEC PGM=PROG1, // ACCT=&DEPT1 //PSTEP2 EXEC PGM=PROG2, // ACCT=&DEPT2 Assigning values to &DEPT1: // SET DEPT1=GRP100 //JSTEP EXEC TRANSACT 5) 日记五 一、VSAM概述: VSAM(Virtual Storage Access Method)是一种相当与接口的访问方法,是操作系统与应用程序之间的桥梁,其主要目的是提高数据存取的效率。 VSAM读取记录的过程如下: 1、VSAM负责解释应用程序的逻辑请求并且决定需要使用的设备 2、VSAM负责向操作系统申请输入和输出的操作。 3、操作系统执行实际的物理输入和输出操作。 4、VSAM将数据返回给应用程序处理。 二、VSAM数据集类型和结构 [术语] 1、控制段(Control Interval、CI) ---CI是VSAM数据集(除了Liner Data Set)输入输出的单位。 结构如右:R1 | R2 | FREE SPACE | RDF2 | RDF1 | CIDF ---其中,R1、R2表示数据,RDF2、RDF1描述CI中的记录信息(长度和起始位置),每个RDF长度为3个字节。CIDF描述FREE SPACE的大小(2字节)和位置(2字节),长度4字节。 ---需要注意的地方,Record从左往右连续填写,RDF紧挨着CIDF从右往左连续填写。FREE SPACE 在中间,刚好两肋插刀。 ---如果一个CI中存放的所有记录的长度都相等的话,则整个CI只有两个RDF,一个说明记录长度,另一个说明记录个数。 ---CI大小范围[512Byte,32K] 2、控制区(Control Area、CA) ---VSAM数据集创建时所需要的磁盘空间大小是以CA为单位进行分配的。 ---由几个连续的CI组成。同一个VSAM里头每个CA都有相同的CI个数。CA的大小可以在定义VSAM数据集的是时候指定。 ---CA大小范围 [一个磁道,一个柱面] 3、相对字节位置(Relative Byte Address、RBA) ---RBA是指VSAM数据集中记录的相对位置,从数据集的起始位置开始计算,VSAM将数据看成连续的字节流。 RBA:02040 R1|R2|R3 4、Spanned Record ---长度超过一个CI大小的记录 ---大小范围(CI,CA-VSAM控制信息] 5、数据集(Cluster) ---一个逻辑上的概念,由若干个物理数据集组成。 ---一般来说,Cluster和Data set之间没什么区别,除了KSDS Cluster。KSDS Cluster 包括KSDS.DATA 和KSDS.INDEX两部分。 [数据集类型] 1、ESDS(Entry-Sequenced Data Set)进入顺序数据集 ---ESDS仅由数据部分组成,本质上来说,它是个SDS。 ---查找记录可以用顺序查找或者是RBA查找;增加记录只能从后面加;更新记录的话,新 记录的长度必须和旧记录的相同;删除记录操作只能从逻辑上删除,无法从磁盘中真正删除。 2、KSDS(Key-Sequenced Data Set)索引顺序数据集 ---KSDS包括两部分:Data Component、Index Component ---每个逻辑记录都有一个索引,记录按照索引的升序排列。 ---索引必须是连续且唯一的。 ---CA中的CI之间可能不是按序排列的,CI内的记录则一定是按序排列。 ---索引是树状结构的。IS(Index Set)包含较高层的索引信息,SS(Sequence Set)包含最低层的索引信息。 ---SS的大小为一个CI,对应一个数据CA,SS包含下一个SS的水平指针和对应的每个CI的最大索引值以及相应CI的指针(CI的RBA) ---SS的指针超过一个CI大小时,系统会建立多级的IS,但是顶层只能有一个IS。 ---KSDS的访问方法: 直接存取 (1)查询顶层IS的索引,以决定要要找的记录位于下一层的哪个IS; (2)循环寻找,直至SS层。 (3)根据SS的记录,对索引所在的CI进行定位。 (4)将该CI从DASD读入到存储器中,取得所要的记录传送到程序中。(以CI为单位进行IO,切记) 顺序存取 (1)定位到第一个CI (2)从第一个记录开始,顺序读取每个记录,直至完成所有的记录读取操作。 定位顺序存取 (1)按照直接存取的方式定位到需要读取的指针 (2)按照顺序存取方式从指定的记录开始顺序处理,直至完成所有操作。 ---KSDS的插入操作: (1)若目标CI有足够空间的话,则在目标位置插入新记录,并建立相应的RDF,更新SS。 (2)如果目标CI没有足够空间,但CA内还有空的CI,则VSAM产生CI Split操作,将原CI的后半部分(N/2的上限)以及它们所对应的RDF移到空的CI内。新记录增加在原CI的相应位置,并增加RDF,更新SS。 (3)如果目标CI没有足够空间,同时CA内没有空的CI,则VSAM产生CA Split操作。 方法类同CI Split 操作,不过要注意的是SS也会split,并且产生IS。 3、RRDS(Relative Record Data Set)相对记录数据集 ---仅由Data Component组成 ---每个CI都分成固定大小的片(slot)并且具有相同数目的slot,每个slot都有一个相对记录编号(RRN)。 ---每个slot都有一个RDF与之对应,RDF表示该slot是否为空。 4、LDS(Linear Data Set)线性数据集合 ---只有Data Component组成,每个CI中都只有数据而没有控制信息。 三、VSAM的编目 1、对数据集的编目实际是对数据集的入口建立列表和索引。 2、在z/OS系统中,主编目只有一个,它描述系统的数据集和用户编目,而用户编目则描述用户的数据集。 3、用户编目的建立是选择性的,主要目的是缩短编目的寻找时间。 4、z/OS系统中,编目结构只有两级。 四、IDCAMS(集成编目访问方法服务实用程序) [格式] //SYSIN DD * DEFINE CLUSTER -/*续行标记 为“,”,切记 (NAME(ST018.EXAMPLE.KSDS1) - /* 子参数间不是用逗号隔开 ,而是空格,切记切记! INDEXED - VOLUNES(USER02) - FREESPACE(20 10) - RECORDSIZE(100 100) ) [AMS命令的应用] 1、DEFINE MASTERCATALOG 建立主编目: DEFINE MASTERCATALOG (parameters) - [DATA(parameters)] - [INDEX(parameters)] - [CATALOG (parameters)] - 2、DEFINE USERCATALOG 建立用户编目: DEFINE USERCATALOG (parameters) - [DATA(parameters)] - [INDEX(parameters)] - [CATALOG (parameters)] - 3、DEFINE CLUSTER (建立并定义VSAM数据集) DEFINE CLUSTER (NAME(entryname) - {CYCINDERS (primary [secondary])| - RECORDS (primary [secondary])} - [FREESPACE (cipercent [capercent])] - [INDEXED | NONINDEXED | NUMBERED | LINEAR] - [KEYS(LENGTH OFFSET)] - [RECORDSIZE(average maximum)] - [RECOVERY | SPEED] - [SHAROPTIONS(crosspartition [cross system])] - [VOLUMES(volser [volser...])]) [DATA ([NAME(entryname)])] [INDEX ([NAME(entryname)])] [CATALOG(mastercatname [/password])] *******说明: (1)NAME:指明VSAM数据集的名字,命名规则和其它数据集相同。 (2)CYLINDERS:以柱面为单位分配空间,仅限于磁盘数据集。Primary指第一次进行分 配的数量,secondary指追加的分配数量。 (3)RECORD:以记录为单位进行数据集的分配。 (4)FREESPACE:给KSDS或者VRRDS中的每个CI和CA分别预留多少百分比的空间。默认为0; (5)INDEXED:数据集类型为KSDS (6)NONINDEXED:数据集类型为ESDS (7)NUMBERED:数据集类型为RRDS,如果记录平均长度和最大长度不一样,则为VRRDS。 (8)LINEAR:数据集类型为LDS (9)KEYS:说明数据集中索引的长度和起始位置。注意,偏移良是从零开始的。 (10)RECORDSIZE:分别指定记录的平均长度和最大长度。如果两值相等,则代表数据集的记录是定长格式 (11)VOLUME: 卷标号 (12)DATA:代表KSDS数据集的数据部分 (13)INDEX:代表KSDS数据集的索引部分 4、REPRO 将记录存入数据集中、复制VSAM数据集、复制编目、分开编目或者合并编目。 REPRO{INDATASET(data set name)| INFILE(DDname)} {OUTDATASET(data set name) OUTFILE(DDname)} [NOREPLACE | REPLACE] [NOREUSE | REUSE] 5、LISTCAT 显示编目的一部分或者全部信息 LISTCAT[CLUSTER | USERCATALOG] [CATALOG (catname)]#说明要显示的数据集的编目信息 [ENTRIES(entryname)]#说明编目中的哪一个数据集信息需要显示 [NAME | ALL]# 把编目中指定的名称显示出来,ALL是显示所有的信息 ********************一个例子********************************* 000100 //ST018A JOB ACCT#,'TRAINER',CLASS=A,NOTIFY=&SYSUID, 000200 //MSGCLASS=X,MSGLEVEL=(1,1) 000300 //STEP1EXEC PGM=IDCAMS 000400 //SYSPRINT DD SYSOUT=* 000500 //SYSINDD * 000600 DELETE 'ST018.VSAM.KSDS1' 000700 SET MAXCC = 0 000800 DEFINE CLUSTER - 000900 (NAME(ST018.VSAM.KSDS1) - 001000 INDEXED - 001100 VOLUME(USER02) - 001200 RECORDS(4000,100) - 001300 RECORDSIZE(80 80) - 001400 CONTROLINTERVALSIZE(4096) - 001500 KEYS(5,4)) 001600 IF LASTCC=0 THEN - 001700 DO 001800 REPRO INDATASET(ST018.SDS.DATA) - 001900 OUTDATASET(ST018.VSAM.KSDS1) 002000 IF LASTCC=0 THEN - 002100 DO 002200 LISTCAT ENT(ST018.VSAM.KSDS1) ALL 002300 PRINTINDATASET(ST018.VSAM.KSDS1) DUMP - 002400 FROMKEY(00100) TOKEY(00300) 002500 IF LASTCC=0 THEN - 002600 DO 002700 LISTCAT ENT(ST018.VSAM.KSDS1) ALL 002800 DELETE 'ST018.VSAM.KSDS1' 002900 DEFINE CLUSTER - 003000 (NAME(ST018.VSAM.KSDS1) - 003100 INDEXED - 003200 VOLUME(USER02) - 003300 RECORDS(3000 100) - 003400 RECSZ(80 80) - 003500 KEYS(5 4) - 003600 CONTROLINTERVALSIZE(4096) - 003700 FREESPACE(10) - 003800 BUFFERSPACE(50000)) 003900 LISTCAT ENT(ST018.VSAM.KSDS1) ALL 004000 END 004100 END 004200 ELSE - 004300 LISTCAT ENT(ST018.VSAM.KSDS1) ALL 4400 END 6) 日记六 大型服务器外存管理 在OS/390中,存贮在外存上的数据可分为以下几种: 系统数据:使用频度最高,应永远可用,并且应存放在性能最好的存储介质上。 软件产品及用户数据:与应用有关,应满足应用的性能及可用性要求。 测试数据:应易于创建及恢复,应有一定的性能及可用性要求。 无论哪一种种数据,都应保证有足够的空间可用。 一个数据集在其生命期内有几个阶段: 创建:用户应确定数据集的大小,逻辑属性等,比如,记录长度。 使用:数据集在最近一段时间经常被使用,因此应当能快速访问,甚至应非常快速地访问,保证24小时可用。 备份:用户数据应定期备份。 迁移:暂时不用的数据应迁移到性能较差的存储设备上。 再用:已迁移出去的数据如再用,应重新移到性能好的设备上。 死亡:不再使用的数据应删除。 图2.1 数据集的生命周期 如图2.1所示,是数据集在其生命期内这几个阶段的示意图。 在S/390中,内存和外存形成了一个多级的存储结构。如图2.2所示是S/390的存储结构: 其中,黑线为处理器存储器与外存的分界线。 寄存器:由半导体器件组成,速度最快。 高速缓存: 速度较快,存放最常用的数据。 中央存储器: 有时称主存,存放正在执行的程序及正在被处理的数据。 扩展存储器:用于存储主存和外存间要交换的数据。不可被CPU直接访问。 外存:主要由磁盘和磁带组成。在S/390中使用的磁盘有很多种型号,有些速度较快,甚至用写磁盘自带CACHE。 图2.2 S/390的多级存储结构 从图2.2中可以看出,OS/390使用了多种存储介质,构成了一个多级的虚拟存储体系。在这个虚拟存储体系中,最常用的数据放在最快的介质上,不常用的数据则放在较慢的介质上。与传统的虚拟存储器不同的是,OS/390在主存和换页空间之间又加了一层EXPANDED STORAGE,使得虚拟存储器的性能价格比得到了进一步的提高。对外存的管理也采取了类似的思想,也就是说,常用的数据集放在了速度较快的介质上,而一旦使用率降低,则被迁移到速度较慢的设备上。 存储管理的任务: 1.介质管理:初始化卷,监视维护卷的使用。包括安装卷,格式化卷,在卷上建立VTOC及VTOC索引。 2.数据管理 :主要包括的任务有:定义编目,选择合适的数据集组织和记录长度,分配数据集等。 3.空间管理:目的是保证卷上有足够的空间创建新的数据集。主要任务有:删除不用的数据集,将不常用的数据集迁移到速度较慢的设备上,释放数据集未用的空间,压缩数据集,整理碎片等。 4.可用性管理:目的是要保证数据集的可用性,也就是说,在数据集出问题时,系统能够从 最近的备份中恢复用户的数据。为实现此目的,重要的手段是备份和恢复。 存储管理在早期比较麻烦,每一个最终用户要管理自己的数据,因此用户要非常了解系统的硬件配置、存储设备的物理逻辑属性、甚至用户自己的数据集的存放位置。而系统管理外存后,将数据集中数据的逻辑视图与物理设备的特性相分离,简化了使用和管理外存的接口,使得外存管理混乱的状况得到极大的改善。 2.2 介质管理 介质管理的主要任务是初始化存储介质、建立VTOC和索引以几件事维护存储介质的使用。在S/390中,最常用的外存介质是磁带和直接访问设备(DASD)。 2.2.1存储介质的存储格式 1( 磁带的存储格式 典型的磁带上的数据组织是以卷标号开始,紧随其后的是文件头标号、文件内容、文件尾,最后是卷尾。卷标号所含的内容有:标号标示(Label ID)和卷序列号(Volume Serial Number);文件头标号所含内容有标号标示(Label ID)和数据集名、记录格式、记录大小及块大小。图2.3和图2.4表示了单卷多文件和多卷单文件的结构。 图2.3 单卷多文件的磁带结构 图2.4 多卷单文件的磁带结构 在单卷多文件情况下,使用JCL时,VOLUME参数表示为:VOL=SER=vol;而在多卷单文件情况下,使用JCL时,VOLUME参数则表示为:VOL=SER=(vol1,vol2),从图中可以看出,第一个卷结束前,没有文件尾标志。 2( 直接访问设备的存储格式 1)磁道的格式: 在OS/390中,每个硬盘称之为卷。卷划分为柱面,柱面又划分为磁道。每个磁道的格式如图2.5所示: 图中的主要部分意义如下: HA(Home address) : SKIP AREA:如果该磁道坏,则指向替换的磁道。 图2.5 DASD设备的磁道格式 F:指示该磁道是否坏。 CCHH:该磁道的柱面及磁道地址。 R0(Record 0):磁道描述记录。 R1-Rn:数据记录1-n。 2)卷格式: 卷的磁道0面0道保留。其R1,R2用于启动,R3含有卷标号,及指向VTOC区的指针。 3( 卷的格式化 ickdsf是一个程序,可由job或ismf命令来执行。其功能是: 1)写卷标。 2)初始化VTOC 3)写初始化代码 4)建VTOC索引(可选) 以下是一个在JCL中运行ICKDSF的示例: //JOBNAME JOB YOUR INSTALLATION'S JOB-ACCOUNTING DATA //JOBCAT DD DSNAME=YOUR.CATALOG,DISP=SHR //STEP1 EXEC PGM=ICKDSF //MYVOL DD UNIT=devicetype,DISP=OLD,VOL=SER=VOL123 //STEPCAT DD DSNAME=ANOTHER.CATALOG,DISP=SHR //SYSPRINT DD SYSOUT=A //SYSIN DD * ICKDSF commands /* 3 数据集的分类及访问方法 2.3.1 数据集的访问方法 一个数据集可以是一个源程序或一个程序要处理的数据文件。程序处理数据集时,记录是其基本的处理单位。数据集一般存放在磁盘或磁带上,卷是外存的基本单元。所有数据均可存放于磁盘上,但只有顺序文件才能存放于磁带上。 磁盘上的任何一块数据都有一个唯一的地址,因此,记录即可以随机又可以顺序地访问。磁盘卷可用于存放数据和程序,包括操作系统本身。 数据管理是操作系统的功能之一,它用于组织、定义、存储、编目及访问数据。其主要功能为: 1)管理磁盘空间。 2)以名字访问编目的数据集。 3)控制数据集的访问。 访问方法定义了数据集读写的技术。访问方法主要由数据集组织的形式所决定。例如,你可以使用基本顺序访问方法(BSAM)去访问一个顺序数据集。当然,用一种访问方法去访问用另外一种访问方法创建的数据集。例如,一个用BSAM方法创建的顺序数据集可以用基本直接访问方法(BDAM)去访问,反之亦可。以下是几种MVS中常用的访问方法: 基本直接访问方法 (BDAM) BDAM让你的程序去指定记录的存放位置,当然读取记录时要以实际地址或相对地址的方式给定相对记录。如果你不知道记录的准确位置,你可以在数据集中给定一个点,然后从这里开始查找记录的起始位置。以这种方式组织的数据集称为直接数据集。这种数据集在使用键时,其有效性远差于VSAM数据集。IBM并不建议使用这种访问方法,但考虑到兼容性,在MVS中仍然支持这种访问方法。 基本的分区访问方法 (BPAM) BPAM 将记录作为分区数据集(PDS)或扩展的分区数据集的成员安排在磁盘数据集中。你可以像顺序数据集那样访问其每一个成员。PDS或 PDSE包含一个目录,反映了成员名和其在数据集中的位置关系。目录用于读取单个的成员。这两种分区数据集的区别如下: PDS: 可存放任何类型的数据,其目录区大小固定。目录区的查找是按字母顺序查找,成员可以增减,但成员被删除后,它所占用的空间不可再被利用,除非整个数据集被压缩。 PDSE:可存放大多数类型的数据,但不能用于存放装入库。目录区大小可变,目录的查找顺序为索引查找。成员可以增加或删除,删除成员后其占用的空间可以被再利用。PDSE必须是SMS管理的。 基本顺序访问方法 (BSAM) BSAM 将记录按照其进入的顺序安排记录的存放位置。按照这种方式组织的数据集称为顺序数据集。用户将多个记录组织成块。这称之为基本访问。 扩展格式的数据集 (Extended Format Data Set) 扩展格式的数据集 与不扩展的顺序数据集在内部存储格式上不同。这种存储格式使 得扩展格式的数据集增加了其它可用性方面的特征。扩展格式的数据集必须是SMS管理的,并且必须存于磁盘上。扩展格式的数据集 不可用于某些特定的系统数据集。扩展格式的数据集 在分配时可以指定为压缩格式。 索引顺序访问方法 (ISAM) ISAM 包括两种访问方法:基本的索引顺序访问方法 (BISAM) 和 队列式的索引顺序访问方法(QISAM)。 由ISAM 方法创建的数据集称之为索引顺序数据集。ISAM 以关键字值的顺序安排记录的存放顺序,并以关键字访问记录。在ISAM 中,多索引的结构类似于VSAM。 IBM 并不推荐使用ISAM,但为了与IBM的其它操作系统相兼容,DFSMS/MVS仍然支持它。应当计划把所有的索引顺素数据集转换为VSAM数据集。索引顺序文件不能被SMS所管理。 队列顺序访问方法(QSAM) 与BSAM类似,QSAM 以记录进入的顺序安排记录的存放位置,形成一个顺序数据集。但与BSAM不同的是QSAM由系统组织记录的成组与分解,也就是说,系统将多个记录组成块。为了提高性能, QSAM往往在记录在使用之前就已提前读入内存。 虚拟存储访问方法 (VSAM) VSAM 以索引键或相对字节地址来安排记录的存放位置。VSAM 用于直接或顺序处理固定或可变长度的记录。为了方便访问,以 VSAM方式组织的数据均经过了分类。VSAM数据集由以下几种: 进入顺序数据集(ESDS):记录以进入数据集的顺序安排其存放位置,新加入的记录家在数据集的末尾。 关键字顺序数据集 (KSDS):记录以关键字升序的顺序存放,以关键字或相对字节地址访问。 线性数据集(LDS):线性数据集中的数据没有记录边界。也没有其它VSAM数据集中所具有的控制信息。这种数据集必须被集成的编目机制(ICF)所编目。 相对记录数据集(RRDS):记录以其相对记录号顺序存放,访问也是通过相对记录号来进行访问。有两种RRDS数据集:固定长度的RRDS,记录必须是定长的;可变长度的RRDS,记录长度可变。 HFS文件 HFS 文件是符合 POSIX标准的文件,它存于HFS数据集中。它们是面向字符的文件,而不像MVS文件那样都是面向记录的。程序可以使用OE的系统调用,比如open,read,write等访问HFS数据集中的内容。程序也可以通过MVS的BSAM,QSAM,VSAM访问方法访问HFS数据集中的信息。当使用BSAM或QSAM访问HFS文件时,把它作为一个单卷的物理顺序文件。尽管HFS文件并不是一个真正的物理顺序文件,但以这些方法访问时系统总是把它仿真为物理顺序文件。 而当使用VSAM时,则HFS被仿真为一个ESDS数据集。 2.3.2 VSAM文件结构及管理 VSAM(Virtual Storage Access Method)文件是IBM公司在虚拟存储器和树型数据结构的基础上,为了满足数据量大,存取速度快和维护方便的要求而发展起来的一种文件组织形式。VSAM文件可分为以下几种组织形式: 1) 键顺序文件KSDS:这种文件与索引文件相似,由索引部分和数据部分组成。索引部分包含树型结构的多级索引。数据部分内的记录按键值顺序排列。因此,这种文件及可以按键值进行顺序存取,也可利用索引,根据键值进行直接存取。 2) 输入顺序文件ESDS:文件内的记录按输入顺序排列。因此,可以按照排列顺序进行存取,也可以指定记录的相对字节地址,对特定记录进行存取。 3) 相对记录文件RRDS:文件空间被划分为等长的SLOT,每个SLOT只存放一个记录,从第一个SLOT开始分别赋予连续的顺序号,这样的号码叫相对记录号。只要给出相对记录号,就可实现对特定记录的直接存取。 4) 线性文件LDS:只有数据组件,由应用去成组/分解逻辑记录。 1( VSAM文件结构 VSAM数据集中的数据除线性数据集外,都被组成记录(逻辑记录)。逻辑记录是用户访问数据集的单位。VSAM的逻辑记录与非VSAM数据集的存储方式不同。VSAM将记录存于CI(Control Interval)。一个CI是直接访问存储设备的一片连续区域,用于存储数据记录及其控制信息。当从直接存储设备上读取一个记录时,包含要读的记录的整个CI都被读到虚存的VSAM I/O缓冲中,然后用户要读的记录才从VSAM缓冲传输到用户定义的工作区。 一个VSAM数据集在一个卷上可以占用最多119到123个Extent,或者占用4,294,967,296个字节。 CI的大小在不同的VSAM数据集中可以不同,但在一个数据集中必须相同。在创建数据集时,你可以用访问方法服务的DEFINE命令指定CI的大小,也可以让系统自动选择CI的大小。 每一个CI含有如下信息: 逻辑记录:每一个CI中可能包含多个逻辑记录。 自由空间:每一个CI中可能含有一定的自由空间,用于插入新的记录。 控制信息:主要为RDF和CIDF,RDF描述每一个记录的信息,而CIDF则描述整个CI的信息。 注意:在线性数据集中,CI全部是数据,无控制信息。 如图2.10所示,是一个VSAM数据集中一个CA的示意图: 图2.10 一个CA 的格式 从图中可以看出控制信息包括2个部分:一个CIDF(Control Interval Definition Field) 和一个或多个RDF(Record Definition Field)。 CIDF为4字节长,含有关于CI的信息,包括自由空间的数量和位置。RDF也是4字节长,描述记录的长度以及有多少相邻的记录是同样长度的。如果有两个以上的记录长度相同,则它们只使用两个RDF,一个记录的长度,另一个则记录有多少个相邻的记录是同样长度的。 VSAM数据集中的多个CI成组为直接访问存储设备中的一片连续区域称之为CA(Control Area),一个VSAM数据集由一个以上的CA组成。CA最大为一个柱面,最小必须是一个磁道。 有时一个记录的大小会大于一个CI的大小,在VSAM中,你不必把这个记录劈开,也不必重新格式化这样的记录,因为在定义数据集时可以用SPANNED参数指定记录可以跨多个CI。 VSAM数据集有4种类型:ESDS(Entry sequenced data set)、KSDS(Key Sequenced Data Set)、LDS(Linear Data Set)、RRDS(Relative Record Data Set)。 ESDS:类似顺序文件。其记录长度可固定也可不固定,新记录只能加在数据集的末尾,已存在的记录不可被删除,如果你一定要删除一个记录,你只能把这个记录标记为不活跃,实际上并未被删除。记录的内容可以被修改但不能改变其长度。访问这样的数据通过其RBA(Relative Byte Address)来进行,RBA一般为双字整数,它表示逻辑记录从数据集起始位置的位移量。尽管ESDS没有索引,但你可以建立一个次键索引,用以记录记录的RBA。 ESDS通过地址进行访问,因此可顺序访问也可随机访问。 KSDS:在KSDS中,每一个逻辑记录含有一个称之为KEY的字段,它唯一地标识一个记录,逻辑记录以KEY升序的顺序存放。KSDS的记录大小可以固定也可以不固定。KEY 必须唯一,必须在每个记录的同样位置,如果是跨CI的记录必须在记录的第一个CI中。记录可以被删除,新增加的记录按其KEY值的大小插入在合适的位置。 定义KSDS后,未用的空间可以散布在整个数据集,以允许插入新的记录。当新的记录插入到一个CI中时,或已存在的记录大小改变时,其后的记录移动到后面的自由空间,以便于新的记录的插入。同样,当一个记录被删除或变小时,释放的空间可以回收,以便于以后使用。创建使你可以指定一个参数FREESPACE指定每一个CI自由空间的比例。也可指定每个CA中自由空间的比例。 在KSDS中,KEY可用于定位要插入的记录的位置,及读取已存在的记录。 最有效地访问KSDS的方法是使用KEY。有以下几种方法: 用顺序的KEY访问可用于读、修改、增加、删除记录。当你指定了顺序的访问方法时,VSAM使用索引以升序或降序的顺序访问数据集。顺序处理可以从数据集的任何位置开始。 直接访问:同样也可用于读、修改、增加、删除记录。你可以指定一个KEY,以此KEY来访问数据集。这个KEY可以是完整的KEY,也可以不完整。比如:你可以指定一个不完整的KEY AB,后面是任何字符。 跳跃的顺序访问: 同样也可用于读、修改、增加、删除记录。在这种方式下,VSAM只读选中的记录,并以升序或降序的顺序。 地址访问:以记录的RBA作为查找参数来访问。一般不建议这样访问。 LDS:LDS的CI大小总是4096字节,无控制信息。应用去成组/分解逻辑记录。用DIV MACRO访问。 固定长度的RRDS:有多个固定长度的SLOT组成。每一个SLOT有一个相对记录号,SLOT以相对记录号排列。每一记录占用一个SLOT。因此记录的位置是固定的,相对记录号也不能改变。无主索引和次索引。由于SLOT可以为空,因此可以插入新记录,或删除已存在的旧记录,而不影响其它记录的位置。记录的RDF指示出SLOT是否为空。在RRDS中,每一个CI含有同样多的SLOT。SLOT的数目由CI的大小和记录的长度决定。 可变长度的RRDS: 可变长度的RRDS与固定长度的RRDS类似,每一个记录也有一个惟一的相对记录号,并且也以相对记录号的顺序存放。但没有SLOT。 你可以为一个KSDS或ESDS定义一个或多个次键索引。用它可以以与主键相同的方式访问数据集,次键可以不惟一,也就是说它可以指向多个数据记录。但是最多只能指向32767个记录。次键本身是一个KSDS,它包含索引组建和数据组件。数据组件中的记录含有次键,以及指向数据的指针。对ESDS来说,指针是RBA;对KSDS来说,指针是主键。 在通过次键访问数据集之前,必须定义一个路径。可用DEFINE PATH命令来定义路径。 2( VSAM数据集的定义、复制及删除 VSAM数据集的定义 定义一个VSAM数据集之前,应注意: 1) VSAM数据集必须是编目的。 2) 可用TSO ALLOCATE命令、访问方法服务的ALLOCATE或DEFINE CLUSTER命令、动态分配或JCL。要用JCL定义一个VSAM数据集,SMS必须活跃。 3) 如有必要可定义次键。 对一个KSDS来说,数据部件和索引部件合称为CLUSTER。 CLUSTER提供了把索引和数据部件统一处理的一种方式。数据部件用于存放数据。 索引部件由顺序集和索引集组成。 数据部件中的每一个CA在顺序集中都有一个对应的CI,它含有其对应的数据部件中的CA中的每一个CI的最大键值及其指针。所有顺序集中的CI又顺序地连接在一起。索引 部件的其它部分构成了索引集。如图2.11所示,所有索引集和顺序集构成了一棵查询树。其中顺序集可用于顺序访问,而索引集和顺序集合起来可用于随机访问。 图2.11 数据和索引的关系 1)用访问方法服务命令定义VSAM数据集 VSAM数据集可以通过DEFINE CLUSTER或ALLOCATE命令来定义。当定义了CLUSTER后,VSAM使用三个编目项描述一个CLUSTER: -一个CLUSTER项把CLUSTER描述为一个部件。 -一个数据项描述CLUSTER的数据部件。 -对KSDS来说,一个索引项描述CLUSTER的索引部件。 (1)关于VSAM文件的属性 如果使用DEFINE CLUSTER命令,数据和索引部件的属性可以与CLUSTER的属性分别指定。 -如果你为CLUSTER指定了属性,则CLUSTER的属性同样适用于部件。 -如果你为CLUSTER和部件都指定了属性,则部件的属性覆盖CLUSTER的属性。 -如用ALLOCATE,则只能在CLUSTER一级指定属性。 定义VSAM数据集时,要指定数据集的属性。如果SMS活跃,你定义的数据集又是系统管理的数据集,你可以指定DATA CLASS,MANAGEMENT CLASS和STORAGE CLASS。你也可以用系统默认的这些CONSTRUCT。CONSTRUCT只能在CLUSTER一级上指定。 以下是定义VSAM数据集是有关的描述性信息: INDEXED|NONINDEXED|NUMBERED|LINEAR:指定数据集的结构形式信息(KSDS、ESDS、RRDS、LDS)。 RECORDSIZE:指定记录的平均和最大长度。不适用于LDS。 注意: 1)可变长度的RRDS用NUMBERED和RECORDSIZE定义,而平均记录长度和最大记录长度必须不同。2)如果对于ESDS,KSDS或可变长度的RRDS数据集,记录长度小于最大记录长度,VSAM把实际记录的长度记录在RDF中。 KEYS:指示KSDS中键的长度和位置。 CATALOG:指示CLUSTER所在的编目的名字和口令。 VOLUMES:指示CLUSTER所在的卷。 RECORDS|KILOBYTES|MEGABYTES|TRACKS|CYLINDERS:指示分配该数据集的空间的单位及大小。 BUFFERSPACE:指示在处理该数据集时,应分配的最小的缓冲。 以下是定义VSAM数据集是有关的性能信息: CONTROLINTERVALSIZE:指定CI的大小。此参数必须大于记录的最大大小。对LDS无效。 SPANNED:指示记录是否可以跨CI。不适用于RRDS和LDS。 IMBED:指示是否将索引的顺序集放在相应的CA中。如果是,则会提高数据集的性能,但会增加空间 对索引组件的VOLUMES:指示是否把索引组件放在另一个卷上。 FREESPACE:指示预留自由空间的大小。 以下是定义VSAM数据集时有关的安全信息: AUTHORIZATION:指定你自己的一个授权子程序,验证对此数据集的访问是否合法。 WRITECHECK:指示对此数据集写后是否要检查,以保证以后能读出。 ERASE:指示数据集被删除后,是否要彻底删除。 (2)VSAM数据集的命名 定义CLUSTER时,要指定CLUSTER名。通常,CLUSTER名就是JCL中给出的DSNAME。也可以各自独立命名索引和数据部件。如果只指定了CLUSTER名而未指定索引和数据部件的名字,VSAM会自动产生索引和数据部件名字。VSAM以下列方式产生索引和数据部件名字: 1) 如果CLUSTER的最后一个QUALIFIER是CLUSTER,则数据部件和索引部件名字的最后一个QUALIFIER分别替换为DATA和INDEX。例如: Cluster名: SALES.REGION2.CLUSTER 产生的数据部件名 = SALES.REGION2.DATA 产生的索引部件名 = SALES.REGION2.INDEX 2) 如果CLUSTER名的长度小于等于38个字符,则分别在CLUSTER名后加.DATA和.INDEX。 例如: Cluster名: DEPT64.ASSET.INFO 产生的数据部件名 = DEPT64.ASSET.INFO.DATA 产生的索引部件名 = DEPT64.ASSET.INFO.INDEX 3) 如果CLUSTER名长度在39到42之间,则在数据部件和索引部件名后分别加.D和.I。例如: Cluster名: DEPTABCD.RESOURCE.REGION66.DATA1234.STUFF 产生的数据部件名 = DEPTABCD.RESOURCE.REGION66.DATA1234.STUFF.D 产生的索引部件名 = DEPTABCD.RESOURCE.REGION66.DATA1234.STUFF.I 产生索引和数据部件的名字后,VSAM会查找编目,以保证产生的部件名字是唯一的。如国不唯一,则重新产生。 可以用访问方法服务ALLOCATE或TSO ALLOCATE命令定义一个暂时的VSAM数据集。也用JCL直接定义。系统管理的暂时的VSAM数据集不需要指定数据集名,而由系统自动产生唯一的名字。如果一定要指定则必须以&或&&打头。 (3)为VSAM数据集分配空间 定义数据集时,你或者SMS(通过指定DATA CLASS)必须指定数据集的空间分配。如果你自己指定则可以以记录数、千字节、兆字节、磁道数、柱面数为单位。为了保持设备的无关性,最好以记录数、千字节、兆字节为单位。你可以在CLUSTER级,数据组件级或索引组件级指定空间大小,但最好在CLUSTER或数据组件级指定。VSAM分配空间的原则如下: -如果指定了CLUSTER和索引组件的大小,则数据组件的大小是CLUSTER的大小减去索引组件的大小。 -如果只指定了数据组件的大小,则指定的大小全部分配给数据组件,索引组件再另外追加一部分空间。 -如果同时指定了数据组件和索引组件的大小,则按指定的大小建立数据集。 如果你定义一个小于一个柱面的数据集,VSAM以磁道为单位分配空间。此时,最好为数据组件指定首次分配的最大磁道数,并且不要指定数据或索引的第二次分配。分配时,VSAM检查指定的设备的柱面大小,如果要分配的数量大于等于设备的柱面大小,则CA等于柱面大小,如果小于则CA大小等于实际分配量。CA最小为一个磁道。 例:假定已知: 设备类型: 3380 分配单位: 柱面 数据CI大小: 1024字节 物理块大小: 1024字节 记录大小: 200字节 CI中的自由空间比例: 20% CA中的自由空间比例: 10% 数据集指定IMBED属性 则: 1) 自由空间的字节数=20%*1024=204 2) 每个CI中的记录数=(1024-10-204)/200=4 其中10个字节留作RDF和CIDF。 3) 每磁道的物理块数=31 在3380中每个磁道有31个物理块,每个物理块大小为1024字节。 4) 每磁道的CI数=31 5) 每个CA的最大CI数=31*14=434 其中,每个柱面15个磁道,一个磁道用于存放顺序集。 6) 每个CA的CI数=434-10%*434=391 7) 每个柱面的记录数=4*391=1564 8) 数据组件的总空间=3000/1564=2个柱面。 在数据集定义后,你可以用访问方法服务命令ALTER去改变数据集的属性。ALTER命令也可用于把ESDS改为LDS。但固定长度的RRDS和可变长度的RRDS不能相互转化。 (4)VSAM文件定义举例 例1.1:创建一个编目,在新创建的编目中定义一个数据集并装入数据,列出数据集的编目项,及打印数据集。 //DEFINE JOB ... //STEP1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE USERCATALOG (NAME (USERCATX) ? ICFCATALOG CYLINDERS(15 5) - VOLUMES(VSER05)) ? DATA (CYLINDERS(3 1)) IF LASTCC = 0 THEN - DEFINE CLUSTER(NAME (EXAMPL1.KSDS)- VOLUMES(VSER05)) - DATA (KILOBYTES (50 5)) /* //STEP2 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSABEND DD SYSOUT=* //AMSDUMP DD SYSOUT=* //INDSET4 DD DSNAME=SOURCE.DATA,DISP=OLD, // VOL=SER=VSER02,UNIT=3380 //SYSIN DD * REPRO INFILE(INDSET4) OUTDATASET(EXAMPL1.KSDS) IF LASTCC = 0 THEN - LISTCAT ENTRIES(EXAMPL1.KSDS) IF LASTCC = 0 THEN - PRINT INDATASET(EXAMPL1.KSDS) /* 例中的IF …THEN等在访问方法服务中称之为MODAL 命令,其语法格式如下: IF LASTCC/MAXCC =/〉/=/<=/~= 数字 THEN [命令 或 DO 命令集 END] [ELSE [命令 或 DO 命令集 END]] LASTCC是上条命令执行的返回码。 第一个DEFINE命令定义了一个用户编目,叫USERCATX。其中: USERCATALOG关键字说明定义用户编目。 NAME:用户编目的名字。 ICFCATALOG:指示定义的编目是ICF编目。 CYLINDERS:指示编目的大小。 VOLUMES:指示编目的位置。如果编目是系统管理的则不必指定此参数。 DATA:指示编目的数据组件。 CYLINDERS: 指示编目的数据组件的大小。 第二个DEFINE命令定义一个叫EXAMPL1.KSDS的KSDS。其中的参数与定义编目 的参数类似,在此不再说明。 REPRO命令将一个已存在的数据集SOURCE.DATA(在INDSET4 DD语句中说明)中的 数据装入到EXAMPL1.KSDS中。其参数如下: INFILE:指示含有源数据的数据集。 OUTDATASET:指示目标数据集。 LISTCAT:列出编目项。 PRINT:打印数据集的内容。 例1.2:用ALLOCATE定义一个暂时的VSAM数据集。 //ALLOC JOB ... //STEP1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=A //SYSIN DD * ALLOC - DSNAME(&CLUSTER) - NEW PASS - RECORG(ES) - SPACE(1,10) - AVGREC(M) - LRECL(256) - STORCLAS(TEMP) /* 其中的参数意义如下: DSNAME:指定已创建的数据集的名字。如果是系统管理的暂时数据集,则必须以&或&& 打头,或者省略。 NEW:指示在此作业步中创建一个新的数据集。 RECORG:指示创建一个ESDS。 SPACE:指示块长度为1,首次分配量为10。 AVGREC:指示SPACE参数指定的值的单位是兆字节。 LRECL:指示逻辑记录长度为256字节。 STORCLAS:指示STORAGE CLASS。如果你没指定,则系统会根据ACS程序自动为你分 配一个。 用JCL定义VSAM数据集 除可变长度的RRDS外,任何类型的VSAM数据集都可以通过JCL来定义。 例1.3:定义一个KSDS //DDNAME DD DSNAME=KSDATA,DISP=(NEW,KEEP), // SPACE=(80,(20,2)),AVGREC=U,RECORG=KS, // KEYLEN=15,KEYOFF=0,LRECL=250 其中: DSNAME:数据集的名字。 DISP:创建新的数据集,并保留。 SPACE:记录长80,首次分配20,追加分配5。 AVGREC:指示SPACE中指定的分配量的比例因子是1。 RECORG:创建KSDS 。 KEYLEN:键长15。 KEYOFF:键在记录中的位置。 LRECL:逻辑记录长250字节。 例1.4:创建一个系统管理的KSDS: //DDNAME DD DSNAME=KSDATA,DISP=(NEW,KEEP), // DATACLAS=STANDARD,STORCLAS=FAST, // MGMTCLAS=STANDARD 例1.5:按照默认值创建一个VSAM数据集。 //DDNAME DD DSNAME=DSVSAM,DISP=(NEW,CATLG) 装入数据到VSAM数据集 数据集定义后,你可以装入数据到VSAM数据集。 -装入ESDS的记录可以是任何顺序。 -固定长度的RRDS把记录装入到SLOT中,其相对记录号不是逻辑记录的一部分。 -装入KSDS的记录必须按键的升序排列,并且不得有重复键。 -装入可变长度的RRDS的记录必须按键的升序排列,并且不得有重复键。 REPRO命令可用于从顺序,索引顺序或VSAM数据集装入数据。也可用于从一个LDS 装入数据到另一个LDS。 装入数据到VSAM数据集的示例可见例1.1。 复制数据集 你可用REPRO作如下事情: -复制或合并VSAM数据集到另一个VSAM数据集。 -复制或合并顺序数据集到另一个顺序数据集。 -把顺序或索引顺序的数据集转换为VSAM数据集。 -把VSAM数据集复制为顺序数据集。 -复制PDS或PDSE数据集的成员。PDS或PDSE数据集不能复制,但单个的成员可以复制。 例1.6:复制整个数据集: //STEP1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=A //MASTER DD DSN=EXAMPLE.KSDS.MASTER,DISP=OLD //BKUP DD DSN=EXAMPLE.SAM.BACKUP,UNIT=SYSDA, // SPACE=(TRK,(2,1),RLSE),DISP=(NEW,CATLG) // VOL=SER=PUB101, // DCB=(RECFM=FB,LRECL=80,BLKSIZE=6120) //SYSIN DD * REPRO INDATASET(MASTER) ? OUTDATASET(BKUP) /* 你也可以只复制一部分记录。用FROMKEY指定从哪一个关键字开始,用FROMADDRESS指定从哪一个记录开始; 用TOKEY指定到哪一个关键字结束, 用TOADDRESS指定到哪一个记录结束。例1.7: //STEP1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=A //SYSIN DD * REPRO IDS(EXAMPLE.LASTNAME.INDEX) ? ODS(EXAMPLE.EXTRACT.ESDS) ? FROMKEY(DEAN) ? TOKEY (LLOYD) /* 也可以归并两个数据集。例1.8: REPRO IDS(INPUT) ODS(OUTPUT) REPLACE 定义次键 次键本身也是一个KSDS。它提供了另一种方法访问VSAM KSDS和ESDS数据集。 定义次键的步骤如下: 1) 定义CLUSTER。 2) 装入数据。 3) 用DEFINE ALTERNATEINDEX命令定义次键。 4) 用DEFINE PATH命令将次键与CLUSTER相关联。 5) 用BLDINDEX命令建立次键。也就是在索引中装入数据。 VSAM用3个编目项描述一个次键: -一个次键项描述次键是一个KSDS。 -一个数据项描述次键的数据部件。 -一个索引项描述次键的索引部件。 定义次键需要指定的信息与定义一个KSDS类似。如果次键允许许多不唯一的键,则RECORDSIZE必须足够大。在定义次键时,如指定了UPGRADE属性,则VSAM数据集改变时,次键自动改变。 例1.9,假定你有一个数据集叫PAYROLL.MASTER,其主键是雇员名字,你想建立一个次键。则: 1) 定义次键: DEFINE ALTERNATEINDEX (NAME(PAYROLL.DEPT.AIX) ? RELATE(PAYROLL.MASTER) ? VOLUMES(AIX001) ? UPGRADE) ? DATA (NAME(PAYROLL.DEPT.AIX.DATA) ? TRACK (5 5) ? RECORDSIZE(200 2096) ? KEY (7 65) ? NONUNIQUEKEY) ? INDEX (NAME(PAYROLL.DEPT.AIX.INDEX) ? IMBED) 2) 定义路径: DEFINE PATH(NAME(RAYROLL.DEPT.PATH) ? PATHENTRY(PAYROLL.DEPT.AIX) ? UPDATE) 3) 在索引中装入数据: BLDINDEX INDATASET(RAYROLL.MASTER) ? OUTDATASET(PAYROLL.DEPT.AIX) 以后你在使用这个数据集时,如果你在JCL中的DD语句如下: //DD1 DD DSN=PAYROLL.MASTER,DISP=SHR 则表示你使用主键访问该数据集。 如果你在JCL中的DD语句如下: //DD1 DD DSN=PAYROLL.DEPT.AIX,DISP=SHR 则表示你使用次键访问该数据集。 删除数据集 使用访问控制服务的DELETE命令可以删除数据集,你可以删除整个CLUSTER,也可以只删除次键或路径。 DSORG是文件的组织结构 主要有以下几种结构 PS PSU DA DAU IS ISU PO POU CX GS Organization | Access Method ___________________________________ _ ___________________ PS Physical sequential data set | BSAM,EXCP,QSAM, | TCAM PSU Physical sequential data set | BSAM,QSAM,EXCP that contains | location-dependent information | DA Direct access data set | BDAM,EXCP DAU Direct access data set that | BDAM,EXCP contains location-dependent | information | IS Indexed sequential data set | BISAM,QISAM,EXCP ISU Indexed sequential data set | QISAM,EXCP that contains | location-dependent information | PO Partitioned data set |BPAM,EXCP (PDS or PDSE) | POU Partitioned data set (PDS) that| BPAM,EXCP contains location-dependent | information | CX Communications line group | BTAM GS Graphic data control block | GAM
本文档为【JCL 帮助文档】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_614050
暂无简介~
格式:doc
大小:150KB
软件:Word
页数:0
分类:互联网
上传时间:2018-02-17
浏览量:94