VSAM学习(1)

VSAM(VirtualStorageAccessMethod)文件主要有以下几种形式:
1.
键顺序文件KSDS
2.
输入顺序文件ESDS
3.相对记录文件RRDS

4.
线性文件LDS

VSAM文件结构:

VSAM数据集中的数据除线性数据集外,都被组成记录(逻辑记录)。逻辑记录是用户访问

数据集的单位。·

CI

ControlInterval ):

一个CI是直接访问存储设备的一片连续区域,用于存储数据记录及

其控制信息。当从直接存储设备上读取一个记录时,包含要读的记录的整个 CI 都被读到虚存

VSAMI/O 缓冲中,然后用户要读的记录才从 VSAM 缓冲传输到用户定义的工作区。一个 VSAM 数据集在一个卷上可以占用最多 119 123 Extent ,或者占用 4 294 967

296个字节。

每一个CI含有如下信息:

逻辑记录:每一个CI中可能包含多个逻辑记录。

自由空间:每一个CI中可能含有一定的自由空间,用于插入新的记录。

控制信息:主要为RDFCIDFRDF描述每一个记录的信息,而CIDF则描述整个CI

的信息。

注意:在线性数据集中,CI全部是数据,无控制信息。

CA(Control

Area):

VSAM数据集中的多个CI成组为直接访问存储设备中的一片连续区域称之为CA,一个VSAM数据集由一个以上的CA组成。CA最大为一个柱面,最小必须是一个磁道。在定义数据集时可以用SPANNED参数指定记录可以跨多个CI

ESDS

类似顺序文件。其记录长度可固定也可不固定,新记录只能加在数据集的末尾,

已存在的记录不可被删除,如果你一定要删除一个记录,你只能把这个记录标记为不活跃,

实际上并未被删除。记录的内容可以被修改但不能改变其长度。访问这样的数据通过其

RBA(RelativeByteAddress) 来进行, 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,也可以不完整。比如:你可以指定一个不完整的KEYAB,后面是任何字符。

跳跃的顺序访问:同样也可用于读、修改、增加、删除记录。在这种方式下,VSAM只读选中的记录,并以升序或降序的顺序。

地址访问:以记录的RBA作为查找参数来访问。一般不建议这样访问。

LDS

LDSCI大小总是4096字节,无控制信息。应用去成组/分解逻辑记录。用DIVMACRO访问。

固定长度的RRDS:有多个固定长度的SLOT组成。每一个SLOT有一个相对记录号,SLOT以相对记录号排列。

可变长度的RRDS可变长度的RRDS与固定长度的RRDS类似,每一个记录也有一个惟一的相对记录号,并且也以相对记录号的顺序存放。但没有SLOT

你可以为一个KSDSESDS定义一个或多个次键索引。用它可以以与主键相同的方式访问数据集,次键可以不惟一,也就是说它可以指向多个数据记录。但是最多只能指向32767个记录。次键本身是一个KSDS,它包含索引组建和数据组件。数据组件中的记录含有次键,以及指向数据的指针。对ESDS来说,指针是RBA;对KSDS来说,指针是主键。在通过次键访问数据集之前,必须定义一个路径。可用DEFINEPATH命令来定义路径。

JCL定义VSAM数据集

除可变长度的RRDS外,任何类型的VSAM数据集都可以通过JCL来定义。

定义一个KSDS

//DDNAMEDDDSNAME=KSDATADISP=(NEWKEEP)

//SPACE=(80(202))AVGREC=URECORG=KS

//KEYLEN=15KEYOFF=0LRECL=250

其中:

DSNAME:数据集的名字。

DISP:创建新的数据集,并保留。

SPACE:记录长80,首次分配20,追加分配5

AVGREC:指示SPACE中指定的分配量的比例因子是1

RECORG:创建KSDS

KEYLEN:键长15

KEYOFF:键在记录中的位置。

LRECL:逻辑记录长250字节。

复制整个数据集:

//STEP1EXECPGM=IDCAMS

//SYSPRINTDDSYSOUT=A

//MASTERDDDSN=EXAMPLE.KSDS.MASTERDISP=OLD

//BKUPDDDSN=EXAMPLE.SAM.BACKUPUNIT=SYSDA

//SPACE=(TRK(21)RLSE)DISP=(NEWCATLG)

//VOL=SER=PUB101

//DCB=(RECFM=FBLRECL=80BLKSIZE=6120)

//SYSINDD*

REPROINDATASET(MASTER)

OUTDATASET(BKUP)

/*

可以只复制一部分记录。用FROMKEY指定从哪一个关键字开始,用FROMADDRESS

定从哪一个记录开始;TOKEY指定到哪一个关键字结束,TOADDRESS指定到哪一个记

录结束。例1.7

//STEP1EXECPGM=IDCAMS

//SYSPRINTDDSYSOUT=A

//SYSINDD*

REPROIDS(EXAMPLE.LASTNAME.INDEX)

ODS(EXAMPLE.EXTRACT.ESDS)

FROMKEY(DEAN)

TOKEY(LLOYD)

/*

归并两个数据集。

REPROIDS(INPUT)ODS(OUTPUT)REPLACE

定义次键

假定你有一个数据集叫PAYROLL.MASTER,其主键是雇员名字,你想建立一个次键。则:

1)定义次键:

DEFINEALTERNATEINDEX(NAME(PAYROLL.DEPT.AIX)

RELATE(PAYROLL.MASTER)

VOLUMES(AIX001)

UPGRADE)

DATA(NAME(PAYROLL.DEPT.AIX.DATA)

TRACK(55)

RECORDSIZE(2002096)

KEY(765)

NONUNIQUEKEY)

INDEX(NAME(PAYROLL.DEPT.AIX.INDEX)

IMBED)

2)定义路径:

DEFINEPATH(NAME(RAYROLL.DEPT.PATH)

PATHENTRY(PAYROLL.DEPT.AIX)

UPDATE)

3)在索引中装入数据:

BLDINDEXINDATASET(RAYROLL.MASTER)

OUTDATASET(PAYROLL.DEPT.AIX)

以后你在使用这个数据集时,如果你在JCL中的DD语句如下:

//DD1DDDSN=PAYROLL.MASTERDISP=SHR

则表示你使用主键访问该数据集。如果你在JCL中的DD语句如下:

//DD1DDDSN=PAYROLL.DEPT.AIXDISP=SHR则表示你使用次键访问该数据集。


使用访问控制服务的DELETE命令可以删除数据集


VSAM的编目

1、对数据集的编目实际是对数据集的入口建立列表和索引。

2、在z/OS系统中,主编目只有一个,它描述系统的数据集和用户编目,而用户编目则描述用户的数据集。

3、用户编目的建立是选择性的,主要目的是缩短编目的寻找时间。

4、z/OS系统中,编目结构只有两级。


IDCAMS(集成编目访问方法服务实用程序)

[格式]

//SYSINDD*

DEFINECLUSTER- /*续行标记 为“-”,切记

(NAME(ST018.EXAMPLE.KSDS1)-  /*子参数间不是用逗号隔开,而是空格,切记切记!

INDEXED-

VOLUNES(USER02)-

FREESPACE(2010)-

RECORDSIZE(100100))

[AMS命令的应用]

1、DEFINEMASTERCATALOG

建立主编目:

DEFINEMASTERCATALOG

(parameters)-

[DATA(parameters)]-

[INDEX(parameters)]-

[CATALOG(parameters)]-

2、DEFINEUSERCATALOG

建立用户编目:

DEFINEUSERCATALOG

(parameters)-

[DATA(parameters)]-

[INDEX(parameters)]-

[CATALOG(parameters)]-

3、DEFINECLUSTER(建立并定义VSAM数据集)

DEFINECLUSTER

(NAME(entryname)-

{CYCINDERS(primary[secondary])|-

RECORDS(primary[secondary])}-

[FREESPACE(cipercent[capercent])]-

[INDEXED|NONINDEXED|NUMBERED|LINEAR]-

[KEYS(LENGTHOFFSET)]-

[RECORDSIZE(averagemaximum)]-

[RECOVERY|SPEED]-

[SHAROPTIONS(crosspartition[crosssystem])]-

[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(datasetname)|

INFILE(DDname)}</s

你可能感兴趣的:(数据结构,OS,AIX)