2.1        引言

外存是用户长期保存数据的地方,在用户的数据处理的预算中,外存设备占了投资的很大比重。而且这种投资在今后也会越来越大,例如,在80年代,一个中等规模的公司平均有44000个数据集,外存空间有102G已足够了;到了90年代,而同样是一个中等规模的公司则平均要有250000个数据集,外存空间则需要1T。因此如何方便、快捷、安全地使用外存及存储在其上的数据,是操作系统外存管理部分的主要任务。

    在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

/*

2.2.2 VTOC和索引


1.        VTOC


VTOC是一个单个Extent的顺序的数据集,并且存放在磁盘的0柱面0磁道之后,65535磁道之前。它记录了存储设备上所有数据集的属性,如数据集名,定位信息,长度,记录格式,使用情况,建立日期等。VTOC由DSCB(Data Set Control Block)组成,它对应于一个数据集,或者驻留于该卷上的VSAM数据集的定位信息,或者未分配的磁道。对应于数据集的DSCB和反映VSAM数据集在该卷上的空间占用情况的DSCB描述了数据集的特性,而描述未分配空间的DSCB则指出了未分配磁道的位置。每个DSCB的记录长度为140字节,格式为:44字节的关键字,记录数据集的名字;96字节的数据区(FMT)记录数据集在磁盘中的位置。一个磁盘VTOC区中DSCB的个数基本确定了可以存在这个磁盘上的数据集的个数。

     VTOC的位置在保存在磁盘的第0柱面的第0磁道上,以及MVS的UCB(Unit Control Block)。每一个磁盘上均有一个VTOC用于定位其上的数据集。如图2.6所示,是VTOC的结构。


图2.6   VTOC的结构

所谓Extent是指磁盘中连续的一片存储空间。在OS/390中磁盘空闲空间的管理类似于我们在操作系统中讲述的可变分区管理。

    DSCB有6种格式(FMT),FMT的意义如下:

    FMT0:自由的DSCB,其140个字节为全0。要删除VTOC中的DSCB,将其写为FMT0即可。在整个VTOC中,FMT0的个数记录在FMT4的DS4DSREC字段。这个字段不能被索引的VTOC维护。对FMT0的查找采用顺序查找。

FMT1:关键字是数据集名,数据区含有数据集类型、属性、创建时间、extent数目、记录格式、记录长度以及前3个extent的位置。如果数据集占用了超过3个extent,还含有指向FMT3的指针。

FMT1的内容如下:

0-        43字节:数据集的名字。

44字节:格式标示,即‘F1’。

45-50字节:数据集的序列号(标示含有数据集或VSAM数据空间的第一个卷或唯一的一个卷。

51-52字节:卷顺序号。

53-55字节:数据集创建日期。

56-58字节:数据集的到期日期。

59字节:数据集在该卷上的extent数。

60字节:最后一个目录块的字节数。

    61字节:标志字节(标示数据集是否是压缩的,是否是检查点数据集。其它6位保留)。

62-74字节:系统代码。

75-77字节:数据上次访问时间,如未曾访问则为0。

78字节:数据集的类型。

79-81字节:第二空间扩展。

82-83字节:数据集的结构。

84字节:记录格式。

85字节:可选的代码。

86-87字节:块长度。

88-89字节:逻辑记录长度。

90字节:键长度。

91-92字节:键的位置。

93字节:数据集指示。

94-97字节:第二次分配空间的参数。

98-100字节:最后一个磁道。

100-104字节:保留。

105-114字节:关于第一个extent的描述。

115-124字节:关于第二个extent的描述。

125-134字节:关于第三个extent的描述。

135-140字节:指向FMT2或FMT3的指针。

    FMT2:描述ISAM数据集的索引。每一个ISAM数据集只有一个索引,如果ISAM数据集是跨卷的数据集,则其索引在数据集所在的第一个卷上。

    FMT3:描述数据集的第4-16个extent。PDSE、顺序扩展格式的数据集以及在ICF编目中编目的VSAM数据集可以有123个extent,如果是这种情况,则数据集的所有FMT3连接在一起形成一个链。其它数据集则在每个卷上至多有16个extent。

    FMT4:描述VTOC的自己。VTOC本身也是一个数据集,也需要一个DSCB描述。它是VTOC区中的第一个记录,描述卷所在的设备,卷的属性,当前情况下FMT0的个数以及VTOC数据集的大小等内容。

FMT5:对于未索引的VTOC,它描述空闲的extent,每个FMT5可描述26个extent,所有的FMT5连接在一起形成一条链。而对索引的VTOC,VTOC中只有一个空的FMT5,自由空间在索引中描述。

图2.7    VTOC及其DSCB与数据集之间的关系

如图2.7所示,是一个卷上的VTOC及其DSCB与数据集之间关系的示例图。在图中,数据集A是一个ISAM数据集,因此占用了三个DSCB,其格式分别为FMT1、FMT2和FMT3。数据集B、C和D可能是顺序的、分区的,也可能是直接数据集或VSAM数据空间。数据集B占用了3个以上的extent,因此需要两个DSCB,分别是FMT1和FMT3。而数据集C和D只占用了少于3个extent,因此各自只需要一个DSCB,即FMT1。

分配一个新数据集的过程:

    1)读VTOC,并锁定VTOC以防其它系统访问。扫描VTOC,查看卷中是否有重名的数据集。

2)扫描VTOC,找出第一个FMT0。

3)扫描FMT5,找到合适的extent(对extent的分配采用最佳适应法)。

    4)分配extent,改写FMT0为FMT1。

5)改写FMT5及FMT4。


2.        索引的VTOC


    由于VTOC是一个顺序的数据集,当卷上数据集很多时,查找速度非常慢,在MVS中可建立其索引以提高其访问性能。SMS管理的卷一定需要建立VTOC的索引,非SMS卷可以不使用VTOC的索引。但最好使用以提高其性能。

VTOC的索引是一个与VTOC在同一个卷上的单独的物理顺序数据集,其名称为:SYS1.VTOCIX.volser。其中volser是卷标号。它包含有数据集名字的索引和卷中自由空间的信息。

在MVS/DFP3.3中,VTOC索引又作了新的改进,使其占用空间更小。这样,如果你使用的是旧版本的MVX/DFP,在版本升级后,你可以使用ICKDSF重建索引以提高性能。

当一个卷在线后,VTOC的位置放置在MVS的VTOC信息块(VIB)中。

ICKDSF将VTOC索引初始化为2048字节的物理块,称为VTOC索引记录(VIR)。VTOC含有以下几种VIR:

VTOC index entry record(VIER):指示FMT1和FMT4 DSCB的位置。

VTOC pack space map(VPSM):指示卷中自由的和已分配的空间。

VTOC index map(VIXM):指示VTOC索引中已分配的索引记录(VIR)。

VTOC map of DSCB(VMDS):指示VTOC中已分配的DSCB。

    VTOC索引的第一个记录是VIXM(VTOC index map),用于定位可用的索引记录。第二个记录是VPSM(VTOC Pack Space Map),用于定位卷中可用的空间.第三个记录是VMDS(VTOC Map of DSCB),用于定位自由的DSCB。其余记录则为索引记录,每一项含有一个数据集名和指向FMT1的指针。索引按字母顺序存放。

所有的索引组成若干个大小为2K的块,称为VIER(VTOC Index Entry Record)。每4个VIER对应高一级VIER中的一项,这样形成一个最大3级的树。如图2.8及2.9所示,是索引的逻辑结构及查找示意图:

图2.8 VTOC索引的逻辑结构



3.        使用索引后分配新数据集的过程

使用索引后,新的数据集的分配过程也有略所改变:

   1)锁卷,以防其它系统访问。查看VTOC及其索引和卷上是否有足够的空间分配给该数据集,并读入最高级别的VIER.

   2)读FMT4。查看此索引是否当前使用的索引。

   3)设置VTOC写标记记录。

   4)读低级的VIER,查找是否有重名的数据集。

   5)找到第一个FMT0,改写为FMT1

   6)分配空间,并改写VPSM,VMDS,VIER及VIXM。

   7)释放卷。

分区的管理采用首次适应法。

   VTOC索引可在初始化卷时通过指定INDEX参数来创建:

     INIT … VTOC(柱面号,磁头号,大小(以磁道为单位))

             INDEX(柱面号,磁头号,大小(以磁道为单位))


图2.9 索引树结构的查找

     一般来说,VTOC应和索引放在一起,而且应足够大,而且留有一定的余量。由于VTOC及其索引不能进一步再扩展,因此在创建时就应该计算其容量,并且留够余量。VOTC的大小取决于卷上数据集数目的多少。每一个数据集至少需要一个DSCB,如果一个数据集使用了多于3个extent,则需要2个以上的DSCB;VSAM最多可以使用123个extent。而索引的大小则于VTOC的大小以及数据集名字的平均长度有关。例如,对于3390来说,假定有2000个数据集存放于其上,VTOC应为40个磁道大(50DSCBs/磁道),索引应占用3个磁道(21 VIERs/磁道)。考虑到留有一定的余量,上述数据还应当在适当地放大一些。


2.        3         数据集的分类及访问方法


2.3.1  数据集的访问方法


           一个数据集可以是一个源程序或一个程序要处理的数据文件。程序处理数据集时,记录是其基本的处理单位。数据集一般存放在磁盘或磁带上,卷是外存的基本单元。所有数据均可存放于磁盘上,但只有顺序文件才能存放于磁带上。

         磁盘上的任何一块数据都有一个唯一的地址,因此,记录即可以随机又可以顺序地访问。磁盘卷可用于存放数据和程序,包括操作系统本身。

         数据管理是操作系统的功能之一,它用于组织、定义、存储、编目及访问数据。其主要功能为:

        1)管理磁盘空间。

        2)以名字访问编目的数据集。

        3)控制数据集的访问。

        访问方法定义了数据集读写的技术。访问方法主要由数据集组织的形式所决定。例如,你可以使用基本顺序访问方法(BSAM)去访问一个顺序数据集。当然,用一种访问方法去访问用另外一种访问方法创建的数据集。例如,一个用BSAM方法创建的顺序数据集可以用基本直接访问方法(BDAM)去访问,反之亦可。以下是几种MVS中常用的访问方法:


           基本直接访问方法 (BDAM)


          BDAM让你的程序去指定记录的存放位置,当然读取记录时要以实际地址或相对地址的方式给定相对记录。如果你不知道记录的准确位置,你可以在数据集中给定一个点,然后从这里开始查找记录的起始位置。以这种方式组织的数据集称为直接数据集。这种数据集在使用键时,其有效性远差于VSAM数据集。IBM并不建议使用这种访问方法,但考虑到兼容性,在MVS中仍然支持这种访问方法。


分区访问方法 (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,也可以只删除次键或路径。在此我们不再详细给出命令的语法及实例,感兴趣的读者可参见有关参考资料。


2.3.3  世代数据集


世代数据集组GDG(GENERATION DATA GROUP)是一组编目的数据集,其组内的每一个数据集称为世代数据集或一代数据集,它们具有相同的名字且在时间序列上是相关的。如要求保留以年内的工资发放数据,每月的工资数据集就是一个世代数据集,全年12个月的工资数据集便构成了一个世代数据集组。

世代数据集可以是顺序数据集或分区数据集,它可以写在磁盘或磁带上,但一个GDG的所有数据集应驻留在相同介质上。由于一个GDG中的所有数据集都使用相同的名字,所以要区分各个世代数据集,就要使用世代编号。世代编号可以是相对编号或绝对编号。系统在维护GDG时使用绝对编号,而应用程序员通常则使用相对编号。

相对编号:假设由一个3代的GDG,PAYROLL.DATA(其中这3代数据集分别为8、9、10三个月份的数据,10月份数据为当前代数据集),则当前一代数据集(10月份的数据集)表示为:DSN=PAYROLL.DATA(0),上一代数据集(9月份的数据集)则表示为

SN=PAYROLL.DATA(-1),更早一代的数据集(8月份的数据集)则表示为:DSN=PAYROLL.DATA(-2).

          如果在该GDG中要产生新一代(11月)数据集,则可写为DSN=PAYROLL.DATA(+1),由此可见这些相对编号时相对于当前一代数据集而言,当前一代数据集用零表示,在当前一代前存入的世代数据集用负数表示,在其之后存入的世代数据集用正数表示。

          绝对编号:在每一个GDG名后加一个后缀GxxxxVyy,其中xxxx为绝对世代编号,yy是版本号(00-99),如果DSN=PAYROLL.DATA(0),对应的实际名字为:PAYROLL.DATA.G0004V00, 而DSN=PAYROLL.DATA(-1),则对应的实际名字为:PAYROLL.DATA.G0003V00。


1.        GDG的定义及建立


        在建立GDG时,首先要为这个世代数据集组指定一个数据调用模式(DSCB模式),如系统中已经有这样的模式,可直接通过DCB参数引用,若没有这样的模式,则需要自己建立这个模式。注意,这个模式必须和所建立的GDG在同一个编目卷上。

          在DSCB模式中应包括卷、卷标、GDG名、空间大小、数据控制块等,当GDG中的各代数据集的数据组织结构、属性不同时,则要实现定义多个模式为不同的数据集提供不同的DCB信息。DSCB模式的建立方法如下:

//DEFMOD1     JOB    …
//STEP0              EXEC    PGM=IEFBR14
//MODEL1        DD         DSN=GDG01.MODEL,DISP=(,CATLG),
//                                            DCB=(RECFM=FB,LRECL=80,BLKSIZE=800),
//                                            VOL=SER==VSER03,UNIT=DISK,
//                                            SPACE=(TRK,(0))

      作业中的EXEC语句调用程序IEFBR14,通常用于JCL语法检查,分配DASD空间及执行DD语句的DISP参数的处理,MODEL1    DD语句定义了数据用模式为GDG01.MODEL,指定了数据控制块、空间参数以及它所在的卷(VSER03),并对其进行编目。

      世代数据组GDG定义及建立过程如下(上述作业可并如下面这个作业中):   

//DEFGDG1        JOB   …
//STEP1                 EXEC    PGM=IDCAMS
//GDGMOD         DD          DSN=GDG01,DISP=(,KEEP),
//                                                     DCB=(RECFM=FB,LRECL=80,BLKSICE=3200),
//                                                     SPACE=(TRK,(0)),UNIT=DISK,VOL=SER=VSER03
//SYSPRINT         DD          SYSOUT=Z
//SYSIN                   DD     *
                DEFINE               GDG-
                            (NAME(GDG01)  -
                                       LIMIT (3) -
                                       NOEMPTY  -
                                       SCRATCH)
/ *

     在GOGMOD  DD 语句中,定义了GDG名(GDG01),在SYSIN  DD 语句中通过DEFINE 命令及子参数定义了世代参数组的有关特性。其中NAME确定了GDG名(GDG01),它表示这个GDG 的每一代具有的名为:GDG01.GxxxxVyy ,这里“xxxx”是世代编号, “yy”是版本号;LIMIT(3)指定在GDG01中可以有三个世代数据集;EMPTY或NOEMPTY参数指出当GDG01中的世代数据集达到LIMIT给定的最大数,而又要加入新的世代数据集时,是否将所有世代数据集移出GDG01,用EMPTY参数表示全部移出,NOEMPTY表示在GDG01中保留最新的三个世代数据集;SCRATCH或NOSCRATCH参数指出移出GDG01的世代数据集是否删除,SCRATCH参数表示删除,NOSCRATCH参数表示不删除。


2.        GDG的存入


//ADDGDG      JOB…
//STEP2              EXEC    PGM=IEFBR14
//GDGDD1        DD         DSNAME=GDG01(+1),DISP=(NEW,CATLG),
//                                             SPACE=(TRK,(10,5)),VOL=SER=VSER03,UNIT=DISK
//                                             DCB=GDG01.MODEL
//SYSPRINT      DD        SYSOUT=*
//SYSIN               DD         *
            THIS  IS  THE  FIRST  GENERATION
/ *

          作业中GDGDD1  DD语句在世代数据组中定义了第一个世代数据集。


3.        GDG的读取


//LSGDG    JBO ……

//STEP3        EXEC    PGM=IEBGENER

//SYSPRINT   DD  SYSOUT=*

//SYSUT1        DD   DSNAME=GDG01(0)

//SYSUT2        DD    SYSOUT=*

//SYSIN            DD    DUMMY

       这个作业是将GDG01中的当前一个世代数据集读取出来,存放在作业的输出列表中,所读取的世代数据集通过SYSUT1   DD语句确定。


4.        GDG的删除


删除一个GDG不像其他类型的数据集那样简单,它需要以下三个步骤:

(1)        删除GDG中的各个世代数据集(提交JCL作业或用ISPF方式删除)。

(2)        删除各个世代数据集的数据调用模式(提交JCL作业或用ISPF方式删除)。

(3)        删除世代数据集组(只能通过AMS中的DELETE命令删除)。

完成上述三个步骤的作业如下:

//DELGDG     JOB ……..
//STEP4      EXEC  PGM=IEFBR14
//DMODEL     DD     DSN=GDG01.MODEL,DISP(OLD,DELETE),
//                                   VOL=SER=VSER03,UNIT=DISK
//STEP5       EXEC       PGM=IDCAMS
//SYSPRINT   DD   SYSOUT=*
//SYSIN   &n