- 学习 VSAM 教程
- VSAM - 首页
- VSAM - 概述
- VSAM - 组件
- VSAM - 集群
- VSAM - ESDS
- VSAM - KSDS
- VSAM - RRDS
- VSAM - LDS
- VSAM - 命令
- VSAM - 备用索引
- VSAM - 目录
- VSAM - 文件状态
- VSAM - 面试问题
- VSAM 有用资源
- VSAM 快速指南
- VSAM - 有用资源
- VSAM - 讨论
VSAM 快速指南
VSAM - 概述
虚拟存储访问方法 (VSAM) 是一种高性能访问方法和数据集组织方式,它通过目录结构来组织和维护数据。它利用虚拟存储的概念,并可以通过提供密码来保护不同级别的数据集。VSAM 可用于 COBOL 程序,如物理顺序文件。VSAM 是用于存储记录的逻辑数据集。文件可以在 VSAM 中顺序读取和随机读取。它是一种改进的数据存储方式,克服了传统文件系统(如顺序文件)的一些限制。
VSAM 的特点
以下是 VSAM 的特点:
VSAM 通过使用密码来保护数据免受未经授权的访问。
VSAM 提供对数据集的快速访问。
VSAM 具有优化性能的选项。
VSAM 允许在批处理和联机环境中共享数据集。
VSAM 在存储数据方面更加结构化和组织化。
VSAM 文件中会自动重复使用空闲空间。
VSAM 的限制
VSAM 唯一的限制是它不能存储在磁带卷上。它始终存储在 DASD 空间中。它需要大量柱面来存储数据,这在成本上不划算。
VSAM - 组件
VSAM 包含以下组件:
- VSAM 集群
- 控制区域
- 控制间隔
VSAM 集群
VSAM 是用于存储记录的逻辑数据集,称为集群。集群是数据集的索引、顺序集和数据部分的关联。VSAM 集群占用的空间被划分为称为控制间隔的连续区域。我们将在本模块的后面讨论控制间隔。
VSAM 集群中有两个主要组件:
索引组件包含索引部分。索引记录存在于索引组件中。使用索引组件,VSAM 能够从数据组件中检索记录。
数据组件包含数据部分。实际数据记录存在于数据组件中。
控制间隔
VSAM 中的控制间隔 (CI) 等效于非 VSAM 数据集的块。在非 VSAM 方法中,数据的单位由块定义。VSAM 使用称为控制间隔的逻辑数据区域。
控制间隔是磁盘和操作系统之间传输的最小单位。每当直接从存储器中检索记录时,包含该记录的整个 CI 都会读入 VSAM 输入/输出缓冲区。然后将所需记录从 VSAM 缓冲区传输到工作区。
控制间隔由以下组成:
- 逻辑记录
- 控制信息字段
- 空闲空间
加载 VSAM 数据集时,会创建控制间隔。默认控制间隔大小为 4K 字节,可以扩展到 32K 字节。
控制间隔分析
以下是上述程序中使用的术语的描述:
R1..R5 - 存储在控制间隔中的记录。
FS - FS 是空闲空间,可用于数据集的进一步扩展。
RDF - RDF 称为记录定义字段。RDF 长 3 字节。它描述了记录的长度,并说明有多少个相邻记录具有相同的长度。
CIDF - CIDF 称为控制间隔定义字段。CIDF 长 4 字节,包含有关控制间隔的信息。
控制区域
通过将两个或多个控制间隔组合在一起形成控制区域 (CA)。VSAM 数据集由一个或多个控制区域组成。VSAM 的大小始终是其控制区域的倍数。VSAM 文件以控制区域为单位扩展。
以下是控制区域的示例:
VSAM - 集群
VSAM 集群在 JCL 中定义。JCL 使用 IDCAMS 实用程序来创建集群。IDCAMS 是 IBM 开发的用于访问方法服务的实用程序。它主要用于定义 VSAM 数据集。
定义集群
以下语法显示了在 定义集群、数据 和 索引 下分组的主要参数。
.DEFINE CLUSTER (NAME(vsam-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - [INDEXED / NONINDEXED / NUMBERED / LINEAR] - RECSZ(average maximum) - [FREESPACE(CI-Percentage,CA-Percentage)] - CISZ(number) - [KEYS(length offset)] - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE] ) - DATA - (NAME(vsam-file-name.data)) - INDEX - (NAME(vsam-file-name.index)) - CATALOG(catalog-name[/password]))
CLUSTER 级别上的参数适用于整个集群。DATA 或 INDEX 级别上的参数仅适用于数据或索引组件。
我们将在下表中详细讨论每个参数:
序号 | 参数及说明 |
---|---|
1 | DEFINE CLUSTER Define Cluster 命令用于定义集群并指定集群及其组件的参数属性。 |
2 | NAME NAME 指定我们正在为其定义集群的 VSAM 文件的名称。 |
3 | BLOCKS Blocks 指定分配给集群的块数。 |
4 | VOLUMES Volumes 指定将包含集群或组件的一个或多个卷。 |
5 | INDEXED / NONINDEXED / NUMBERED / LINEAR 此参数可以取三个值 INDEXED、NONINDEXED 或 NUMBERED,具体取决于我们正在创建的数据集类型。对于键顺序 (KSDS) 文件,使用 INDEXED 选项。对于条目顺序 (ESDS) 文件,使用 NONINDEXED 选项。对于相对记录 (RRDS) 文件,需要 NUMBERED 选项。对于线性 (LDS) 文件,需要 LINEAR 选项。此参数的默认值为 INDEXED。我们将在接下来的模块中进一步讨论 KSDS、ESDS、RRDS 和 LDS。 |
6 | RECSZ Record Size 参数有两个值,分别是平均记录大小和最大记录大小。Average 指定文件中逻辑记录的平均长度,Maximum 表示记录的长度。 |
7 | FREESPACE Freespace 指定为数据组件的控制间隔 (CI) 和控制区域 (CA) 保留的空闲空间百分比。此参数的默认值为零百分比。 |
8 | CISZ CISZ 称为控制间隔大小。它指定控制间隔的大小。 |
9 | KEYS Keys 参数仅在键顺序 (KSDS) 文件中定义。它指定主键从第一列开始的长度和偏移量。此参数的值范围为 1 到 255 字节。 |
10 | READPW READPW 参数中的值指定读取级别的密码。 |
11 | FOR/TO 此参数的值指定保留文件的时长(以日期和天数表示)。此参数的默认值为零天。 |
12 | UPDATEPW UPDATEPW 参数中的值指定更新级别的密码。 |
13 | REUSE / NOREUSE REUSE 参数允许定义可以重置为空状态而无需删除和重新定义的集群。 |
14 | DATA - NAME 集群的 DATA 部分包含包含文件实际数据的的数据集名称。 |
15 | INDEX-NAME 集群的 INDEX 部分包含主键和数据部分中对应记录的内存指针。当使用键顺序集群时,会定义它。 |
16 | CATALOG Catalog 参数表示将在其下定义文件的目录。我们将在后续模块中单独讨论目录。 |
示例
以下是一个基本示例,说明如何在 JCL 中定义集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.KSDSFILE) - INDEXED - RECSZ(80 80) - TRACKS(1,1) - KEYS(5 0) - CISZ(4096) - FREESPACE(3 3) ) - DATA (NAME(MY.VSAM.KSDSFILE.DATA)) - INDEX (NAME(MY.VSAM.KSDSFILE.INDEX)) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并且它将创建 MY.VSAM.KSDSFILE VSAM 文件。
删除集群
要删除 VSAM 文件,需要使用 IDCAMS 实用程序删除 VSAM 集群。DELETE 命令从目录中删除 VSAM 集群的条目,并可选地删除文件,从而释放对象占用的空间。如果 VSAM 数据集未过期,则不会删除它。要删除此类数据集,请使用 PURGE 选项。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
以上语法显示了我们可以与 Delete 语句一起使用的参数。我们将在下表中详细讨论每个参数:
序号 | 参数及说明 |
---|---|
1 |
ERASE / NOERASE ERASE 选项指定覆盖在目录中为对象指定的 ERASE 属性。NOERASE 选项默认为默认值。 |
2 |
FORCE / NOFORCE FORCE 选项指定删除 SPACE 和 USERCATALOG,即使它们不为空。NOFORCE 选项默认为默认值。 |
3 |
PURGE / NOPURGE PURGE 选项用于删除 VSAM 数据集,如果数据集尚未过期。NOPURGE 选项默认为默认值。 |
4 |
SCRATCH / NOSCRATCH SCRATCH 选项指定从卷目录表中删除与对象关联的条目。它主要用于非 vsam 数据集,如 GDG。NOSCRATCH 选项默认为默认值。 |
示例
以下是一个基本示例,说明如何在 JCL 中删除集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.KSDSFILE CLUSTER PURGE /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并且它将删除 MY.VSAM.KSDSFILE VSAM 文件。
VSAM - ESDS
ESDS 称为条目顺序数据集。条目顺序数据集的行为类似于顺序文件组织,但包含更多功能。我们可以直接访问记录,并且出于安全目的,我们也可以使用密码。我们必须在 DEFINE CLUSTER 命令中为 ESDS 数据集编码 NONINDEXED。以下是 ESDS 的主要功能:
ESDS 集群中的记录按插入数据集的顺序存储。
记录通过称为 相对字节地址 (RBA) 的物理地址来引用。假设在一个 ESDS 数据集中,我们有 80 字节的记录,第一个记录的 RBA 为 0,第二个记录的 RBA 为 80,第三个记录的 RBA 为 160,依此类推。
可以通过称为 寻址访问 的 RBA 顺序访问记录。
记录按照插入的顺序保存。新记录插入到末尾。
ESDS 数据集中无法删除记录。但可以将其标记为非活动状态。
ESDS 数据集中的记录可以是固定长度或可变长度。
ESDS 未建立索引。ESDS 数据集中不存在键,因此可能包含重复记录。
ESDS 可以像任何其他文件一样在 COBOL 程序中使用。我们将在 JCL 中指定文件名,并且可以在程序内部使用 ESDS 文件进行处理。在 COBOL 程序中,将文件组织指定为**顺序**,并将访问模式指定为**顺序**,并使用 ESDS 数据集。
定义 ESDS 集群
以下语法显示了在创建 ESDS 集群时可以使用哪些参数。参数描述与 VSAM - 集群模块中提到的相同。
DEFINE CLUSTER (NAME(esds-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - NONINDEXED - RECSZ(average maximum) - [FREESPACE(CI-Percentage,CA-Percentage)] - CISZ(number) - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE]) - DATA - (NAME(esds-file-name.data))
示例
以下示例演示了如何在 JCL 中使用 IDCAMS 实用程序创建 ESDS 集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.ESDSFILE) - NONINDEXED - RECSZ(80 80) - TRACKS(1,1) - CISZ(4096) - FREESPACE(3 3) ) - DATA (NAME(MY.VSAM.ESDSFILE.DATA)) /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将创建 MY.VSAM.ESDSFILE VSAM 文件。
删除 ESDS 集群
ESDS 集群使用 IDCAMS 实用程序删除。DELETE 命令从目录中删除 VSAM 集群的条目,并可选地删除文件,从而释放对象占用的空间。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
以上语法显示了在删除 ESDS 集群时可以使用哪些参数。参数描述与 VSAM - 集群模块中提到的相同。
示例
以下示例演示了如何在 JCL 中使用 IDCAMS 实用程序删除 ESDS 集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.ESDSFILE CLUSTER /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将删除 MY.VSAM.ESDSFILE VSAM 集群。
VSAM - KSDS
KSDS 称为键顺序数据集。键顺序数据集 (KSDS) 比 ESDS 和 RRDS 更复杂,但更有用且用途更广泛。对于 KSDS 数据集,我们必须在 DEFINE CLUSTER 命令中编码**索引**。KSDS 集群包含以下两个组件:
**索引** - KSDS 集群的索引组件包含集群中记录的键值的列表,以及指向数据组件中相应记录的指针。索引组件引用 KSDS 记录的物理地址。这将每个记录的键与其在数据集中的相对位置相关联。添加或删除记录时,此索引会相应更新。
**数据** - KSDS 集群的数据组件包含实际数据。KSDS 集群数据组件中的每个记录都包含一个键字段,该字段具有相同数量的字符,并且在每个记录中的相对位置相同。
以下是 KSDS 的主要特征:
KSDS 数据集中的记录始终按键字段排序。记录按键的升序排序顺序存储。
可以顺序访问记录,也可以直接访问记录。
记录使用键标识。每个记录的键是记录中预定义位置的一个字段。每个键在 KSDS 数据集中必须是唯一的。因此,不允许重复记录。
插入新记录时,记录的逻辑顺序取决于键字段的排序顺序。
KSDS 数据集中的记录可以是固定长度或可变长度。
KSDS 可以像任何其他文件一样在**COBOL**程序中使用。我们将在 JCL 中指定文件名,并且可以在程序内部使用 KSDS 文件进行处理。在 COBOL 程序中,将文件组织指定为**索引**,并且可以使用任何访问模式**(顺序、随机或动态)**以及 KSDS 数据集。
KSDS 文件结构
为了搜索特定记录,我们提供一个唯一的键值。在索引组件中搜索键值。找到键后,检索指向数据组件的相应内存地址。从内存地址,我们可以获取存储在数据组件中的实际数据。以下示例显示了索引和数据文件的基本结构:
定义 KSDS 集群
以下语法显示了在创建 KSDS 集群时可以使用哪些参数。
参数描述与 VSAM - 集群模块中提到的相同。
DEFINE CLUSTER (NAME(ksds-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - INDEXED - KEYS(length offset) - RECSZ(average maximum) - [FREESPACE(CI-Percentage,CA-Percentage)] - CISZ(number) - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE]) - DATA - (NAME(ksds-file-name.data)) - INDEX - (NAME(ksds-file-name.index))
示例
以下示例演示了如何在 JCL 中使用 IDCAMS 实用程序创建 KSDS 集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.KSDSFILE) - INDEXED - KEYS(6 1) - RECSZ(80 80) - TRACKS(1,1) - CISZ(4096) - FREESPACE(3 3) ) - DATA (NAME(MY.VSAM.KSDSFILE.DATA)) - INDEX (NAME(MY.VSAM.KSDSFILE.INDEX)) - /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并且它将创建 MY.VSAM.KSDSFILE VSAM 文件。
删除 KSDS 集群
KSDS 集群使用 IDCAMS 实用程序删除。DELETE 命令从目录中删除 VSAM 集群的条目,并可选地删除文件,从而释放对象占用的空间。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
以上语法显示了在删除 KSDS 集群时可以使用哪些参数。参数描述与 VSAM - 集群模块中提到的相同。
示例
以下示例演示了如何在 JCL 中使用 IDCAMS 实用程序删除 KSDS 集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.KSDSFILE CLUSTER /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将删除 MY.VSAM.KSDSFILE VSAM 集群。
VSAM - RRDS
RRDS 称为相对记录数据集。RRDS 集群类似于 ESDS 集群。唯一的区别在于 RRDS 记录通过**相对记录号 (RRN)**访问,我们必须在 DEFINE CLUSTER 命令中编码**编号**。以下是 RRDS 的主要特征:
相对记录数据集具有由**相对记录号 (RRN)**标识的记录,该号码是相对于第一条记录的序列号。
RRDS 允许按编号访问记录,例如记录 1、记录 2 等。这提供了随机访问,并假设应用程序程序有办法获取所需的记录号。
可以顺序访问 RRDS 数据集中的记录,按照相对记录号顺序,或者直接通过提供所需记录的相对记录号来访问。
RRDS 数据集中的记录存储在固定长度的槽中。每个记录都由其槽的编号引用,编号可以从 1 变化到数据集中记录的最大数量。
可以通过将新记录插入空槽中来写入 RRDS 中的记录。
可以从 RRDS 集群中删除记录,从而留下一个空槽。
使用固定长度记录或具有上下文含义的记录号的应用程序可以使用 RRDS 数据集。
RRDS 可以像任何其他文件一样在**COBOL**程序中使用。我们将在 JCL 中指定文件名,并且可以在程序内部使用 KSDS 文件进行处理。在 COBOL 程序中,将文件组织指定为**相对**,并且可以使用任何访问模式**(顺序、随机或动态)**以及 RRDS 数据集。
RRDS 文件结构
在 RRDS 文件结构中,空间被划分为固定长度的槽。一个槽可以是完全空闲的,也可以是完全满的。因此,可以将新记录添加到空槽中,并且可以从已填充的槽中删除现有记录。我们可以通过提供相对记录号直接访问任何记录。以下示例显示了数据文件的基本结构:
数据组件
相对记录号 | 记录字段 1 | 记录字段 2 |
---|---|---|
1 | 教程 | 要点 |
2 | Mohtashim | M. |
3 | Nishant | Malik |
定义 RRDS 集群
以下语法显示了在创建 RRDS 集群时可以使用哪些参数。
参数描述与 VSAM - 集群模块中提到的相同。
DEFINE CLUSTER (NAME(rrds-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - NUMBERED - RECSZ(average maximum) - [FREESPACE(CI-Percentage,CA-Percentage)] - CISZ(number) - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE]) - DATA - (NAME(rrds-file-name.data))
示例
以下示例演示了如何在 JCL 中使用 IDCAMS 实用程序创建 RRDS 集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.RRDSFILE) - NUMBERED - RECSZ(80 80) - TRACKS(1,1) - REUSE - FREESPACE(3 3) ) - DATA (NAME(MY.VSAM.RRDSFILE.DATA)) /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将创建 MY.VSAM.RRDSFILE VSAM 文件。
删除 RRDS 集群
RRDS 集群使用 IDCAMS 实用程序删除。DELETE 命令从目录中删除 VSAM 集群的条目,并可选地删除文件,从而释放对象占用的空间。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
以上语法显示了在删除 RRDS 集群时可以使用哪些参数。参数描述与 VSAM - 集群模块中提到的相同。
示例
以下示例演示了如何在 JCL 中使用 IDCAMS 实用程序删除 RRDS 集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.RRDSFILE CLUSTER /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将删除 MY.VSAM.RRDSFILE VSAM 集群。
VSAM - LDS
LDS 称为线性数据集。线性数据集是在传统操作系统文件中使用的唯一形式的字节流数据集。线性数据集很少使用。以下是 LDS 的主要特征:
线性数据集不包含 RDF 和 CIDF,因为它在其 CI 中没有嵌入任何控制信息。
在线性数据集中,可以作为虚拟存储中的字节可寻址字符串访问数据。
线性数据集的控制间隔大小为 4K 字节。
LDS 是一种非 VSAM 文件,具有一些 VSAM 功能,例如使用 IDCAMS 和目录中的 VSAM 特定信息。
DB2 目前是线性数据集最大的用户。
IDCAMS 用于定义 LDS,但它是使用数据在虚拟 (DIV) 宏访问的。
线性数据集没有记录的概念。所有 LDS 字节都是数据字节。
定义 LDS 集群
以下语法显示了在创建 LDS 集群时可以使用哪些参数。参数描述与 VSAM - 集群模块中提到的相同。
DEFINE CLUSTER (NAME(lds-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - LINEAR - CISZ(number) - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE]) - DATA - (NAME(lds-file-name.data))
示例
以下示例演示了如何在 JCL 中使用 IDCAMS 实用程序创建 LDS 集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.LDSFILE) - LINEAR - TRACKS(1,1) - CISZ(4096) ) - DATA (NAME(MY.VSAM.LDSFILE.DATA)) /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将创建 MY.VSAM.LDSFILE VSAM 文件。
删除 LDS 集群
LDS 集群使用 IDCAMS 实用程序删除。DELETE 命令从目录中删除 VSAM 集群的条目,并可选地删除文件,从而释放对象占用的空间。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
以上语法显示了在删除 LDS 集群时可以使用哪些参数。参数描述与 VSAM - 集群模块中提到的相同。
示例
以下示例演示了如何在 JCL 中使用 IDCAMS 实用程序删除 LDS 集群:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.LDSFILE CLUSTER /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将删除 MY.VSAM.LDSFILE VSAM 集群。
VSAM - 命令
VSAM 命令用于对 VSAM 数据集执行某些操作。以下是最有用的 VSAM 命令:
- 更改
- 复制
- 列出目录
- 检查
- 验证
更改
ALTER 命令用于修改 VSAM 文件属性。我们可以更改 VSAM 文件的属性,这些属性在 VSAM 集群定义中已提及。以下是更改属性的语法:
ALTER file-cluster-name [password] [ADDVOLUMES(volume-serial)] [BUFFERSPACE(size)] [EMPTY / NOEMPTY] [ERASE / NOERASE] [FREESPACE(CI-percentage CA-percentage)] [KEYS(length offset)] [NEWNAME(new-name)] [RECORDSIZE(average maximum)] [REMOVEVOLUMES(volume-serial)] [SCRATCH / NOSCRATCH] [TO(date) / FOR(days)] [UPGRADE / NOUPGRADE] [CATALOG(catalog-name [password]]
以上语法显示了在现有 VSAM 集群中可以更改哪些参数。参数描述与 VSAM - 集群模块中提到的相同。
示例
以下示例显示了如何使用 ALTER 命令来增加空闲空间、添加更多卷以及更改键:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * ALTER MY.VSAM.KSDSFILE [ADDVOLUMES(2)] [FREESPACE(6 6)] [KEYS(10 2)] /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将更改空闲空间、卷和键。
复制
REPRO 命令用于将数据加载到 VSAM 数据集中。它还用于将数据从一个 VSAM 数据集复制到另一个数据集。我们可以使用此命令将数据从顺序文件复制到 VSAM 文件。IDCAMS 实用程序使用 REPRO 命令加载数据集。
REPRO INFILE(in-ddname) OUTFILE(out-ddname)
在上述语法中,in-ddname 是包含记录的输入数据集的 DD 名。out-ddname 是输出数据集的 DD 名,输入数据集的记录将被复制到其中。
示例
以下示例显示了如何将记录从一个数据集复制到另一个 VSAM 数据集:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //IN DD DSN = MY.VSAM.KSDSFILE,DISP = SHR //OUT DD DSN = MY.VSAM1.KSDSFILE,DISP = SHR //SYSPRINT DD SYSOUT = * //SYSIN DD * REPRO INFILE(IN) OUTFILE(OUT) /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将把 MY.VSAM.KSDSFILE 中的所有记录复制到 MY.VSAM1.KSDSFILE VSAM 文件中。
列出目录
LISTCAT 命令用于获取 VSAM 数据集的目录详细信息。Listcat 命令提供有关 VSAM 数据集的以下信息:
- SMS 信息
- RLS 信息
- 卷信息
- 球体信息
- 分配信息
- 数据集属性
LISTCAT ENTRY(vsam-file-name) ALL
在上述语法中,vsam-file-name 是我们需要所有信息的 VSAM 数据集名称。指定 ALL 关键字以获取所有目录详细信息。
示例
以下示例显示了如何使用 Listcat 命令获取 VSAM 数据集的所有详细信息:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * LISTCAT ENTRY(MY.VSAM.KSDSFILE) ALL /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将显示有关 MY.VSAM.KSDSFILE 数据集的所有目录详细信息。
检查
Examine 命令用于检查键顺序数据集集群的结构完整性。它检查索引和数据组件,如果发现任何问题,则错误消息将发送到输出队列。您可以检查任何 IDCxxxxx 消息。
EXAMINE NAME(vsam-ksds-name) - INDEXTEST DATATEST - ERRORLIMIT(50)
在上述语法中,vsam-ksds-name 是我们需要检查 VSAM 集群的索引和数据部分的 VSAM 数据集名称。
示例
以下示例显示了如何检查 KSDS 数据集的索引和数据部分是否同步:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * EXAMINE NAME(MY.VSAM.KSDSFILE) - INDEXTEST DATATEST - ERRORLIMIT(50) /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将显示 VSAM 数据集中所有问题,这些问题在输出队列中的 IDCxxxxx 消息之一中。
验证
Verify 命令用于检查和修复在错误后未正确关闭的 VSAM 文件。该命令会向文件添加正确的文件结束记录。
VERIFY DS(vsam-file-name)
在上述语法中,vsam-file-name 是我们需要检查错误的 VSAM 数据集名称。
示例
以下示例显示了如何检查和修复 VSAM 数据集中的错误:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * VERIFY DS(MY.VSAM.KSDSFILE) /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将修复 VSAM 数据集中的错误。
VSAM - 备用索引
备用索引是在 KSDS/ESDS 数据集上除了其主索引之外创建的附加索引。备用索引通过使用多个键来提供对记录的访问。备用索引的键可以是非唯一键,它可以有重复项。
创建备用索引
以下步骤用于创建备用索引:
- 定义备用索引
- 定义路径
- 构建索引
定义备用索引
备用索引使用 **DEFINE AIX** 命令定义。
DEFINE AIX - (NAME(alternate-index-name) - RELATE(vsam-file-name) - CISZ(number) - FREESPACE(CI-Percentage,CA-Percentage) - KEYS(length offset) - NONUNIQUEKEY / UNIQUEKEY - UPGRADE / NOUPGRADE - RECORDSIZE(average maximum)) - DATA - (NAME(vsam-file-name.data)) - INDEX - (NAME(vsam-file-name.index))
以上语法显示了定义备用索引时使用的参数。我们已经在定义集群模块中讨论了一些参数,并且在定义备用索引时使用了一些新参数,我们将在此处讨论:
序号 | 参数及说明 |
---|---|
1 | DEFINE AIX Define AIX 命令用于定义备用索引并为其组件指定参数属性。 |
2 | NAME NAME 指定备用索引的名称。 |
3 | RELATE RELATE 指定创建备用索引的 VSAM 集群的名称。 |
4 | NONUNIQUEKEY / UNIQUEKEY UNIQUEKEY 指定备用索引是唯一的,而 NONUNIQUEKEY 指定可能存在重复项。 |
5 | UPGRADE / NOUPGRADE UPGRADE 指定如果基本集群被修改,则应修改备用索引,而 NOUPGRADE 指定如果基本集群被修改,则应保留备用索引。 |
示例
以下是一个基本示例,用于演示如何在 JCL 中定义备用索引:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE AIX (NAME(MY.VSAM.KSDSAIX) - RELATE(MY.VSAM.KSDSFILE) - CISZ(4096) - FREESPACE(20,20) - KEYS(20,7) - NONUNIQUEKEY - UPGRADE - RECORDSIZE(80,80)) - DATA(NAME(MY.VSAM.KSDSAIX.DATA)) - INDEX(NAME(MY.VSAM.KSDSAIX.INDEX)) /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将创建 MY.VSAM.KSDSAIX 备用索引。
定义路径
定义路径用于将备用索引与基本集群关联。定义路径时,我们指定路径的名称以及此路径相关的备用索引。
DEFINE PATH - NAME(alternate-index-path-name) - PATHENTRY(alternate-index-name))
以上语法有两个参数。NAME 用于指定备用索引路径名称,而 PATHENTRY 用于指定备用索引名称。
示例
以下是一个在 JCL 中定义路径的基本示例:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE PATH - NAME(MY.VSAM.KSDSAIX.PATH) - PATHENTRY(MY.VSAM.KSDSAIX)) /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将在备用索引与基本集群之间创建路径。
构建索引
BLDINDEX 命令用于构建备用索引。BLDINDEX 读取 VSAM 索引数据集(或基本集群)中的所有记录,并提取构建备用索引所需的数据。
BLDINDEX - INDATASET(vsam-cluster-name) - OUTDATASET(alternate-index-name))
以上语法有两个参数。INDATASET 用于指定 VSAM 集群名称,而 OUTDATASET 用于指定备用索引名称。
示例
以下是在 JCL 中构建索引的基本示例:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * BLDINDEX - INDATASET(MY.VSAM.KSDSFILE) - OUTDATASET(MY.VSAM.KSDSAIX)) /*
如果在大型机服务器上执行上述 JCL,它应该以 MAXCC = 0 执行,并且将构建索引。
VSAM - 目录
目录维护数据集所在的单元和卷。目录用于检索数据集。非 VSAM 数据集通过 JCL 中的处理参数创建目录条目。VSAM 数据集以 KSDS 集群的形式维护其自己的目录。在下图中,您可以看到 VSAM 目录的类型:
主目录
主目录本身是一个文件,它监视和管理 VSAM 的操作。在任何系统中只有一个主目录,其中包含有关系统数据集和 VSAM 数据集的条目。VSAM 和非 VSAM 数据集可能在主目录中具有条目,但这并不是一个好的做法。主目录是在系统生成过程中创建的,并驻留在系统卷上。主目录拥有操作系统中的所有 VSAM 资源。VSAM 中使用的所有文件都由主目录控制。主目录负责以下操作:
- 文件的密码授权
- 增强安全性
- 文件的 VSAM 访问
- 文件的空间管理
- 文件的位置
- 文件中可用的空闲空间
当上述任何文件属性更改时,它们都会自动更新到主目录中。主目录是使用 IDCAMS 程序定义的。
用户目录
用户目录具有与主目录相同的结构和概念。它位于主目录之后的下一层层次结构级别。用户目录在系统中不是强制性的,但它用于增强 VSAM 系统的安全性。主目录指向 VSAM 文件,但如果存在用户目录,则主目录指向用户目录。用户目录的数量可以根据系统需求而定。在 VSAM 结构中,如果删除主目录,则不会影响用户目录。用户目录包含有关特定于应用程序的数据集的条目。用户目录的信息存储在主目录中。
数据空间
数据空间是直接访问存储设备中专门分配用于 VSAM 使用的区域。在创建 VSAM 集群之前必须创建数据空间。数据空间占用的区域记录在卷目录表 (VTOC) 中,因此该空间将不可用于分配给任何其他用途,无论是 VSAM 还是非 VSAM。VTOC 具有空间占用区域的条目。VSAM 创建数据空间以保存用户目录条目。VSAM 控制此空间,并根据 VSAM 文件的需要监视和维护此空间。
唯一集群
唯一集群包含一个单独的数据空间,该空间完全由在其内创建的集群使用。唯一集群是从直接访问存储上的未分配空间创建的。
子分配集群
子分配的 VSAM 文件与其他子分配的文件共享 VSAM 空间。它指定文件应在现有的 VSAM 空间内进行子分配。子分配用于更轻松地管理和控制 VSAM 空间。
非 VSAM 数据集
非 VSAM 数据集驻留在磁带和直接访问存储上。非 VSAM 数据集可能在主目录和用户目录中都有条目。对非 VSAM 数据集进行编目 的主要功能是保留单元和卷序列号信息。
VSAM - 文件状态
在使用 VSAM 数据集时,您可能会遇到异常结束。以下是常见的文件状态代码及其说明,这将有助于您解决问题:
代码 | 描述 |
---|---|
00 | 操作成功完成 |
02 | 找到非唯一备用索引重复键 |
04 | 无效的固定长度记录 |
05 | 执行 OPEN 文件时文件不存在 |
10 | 遇到文件结束 |
14 | 尝试读取文件边界之外的相关记录 |
20 | VSAM KSDS 或 RRDS 的无效键 |
21 | 执行 WRITE 或在 REWRITE 上更改键时发生顺序错误 |
22 | 找到主重复键 |
23 | 未找到记录或文件 |
24 | 键超出文件边界 |
30 | 永久 I/O 错误 |
34 | 记录超出文件边界 |
35 | 执行 OPEN 文件时文件不存在 |
37 | 使用错误模式打开文件 |
38 | 尝试打开已锁定的文件 |
39 | 由于文件属性冲突而导致 OPEN 失败 |
41 | 尝试打开已打开的文件 |
42 | 尝试关闭未打开的文件 |
43 | 尝试在先不读取记录的情况下执行 REWRITE |
44 | 尝试重写不同长度的记录 |
46 | 尝试读取超出文件结束 |
47 | 尝试从未以 I-O 或 INPUT 打开的文件中读取 |
48 | 尝试写入未以 I-O 或 OUTPUT 打开的文件 |
49 | 尝试删除或重写未以 I-O 打开的文件 |
91 | 密码或授权失败 |
92 | 逻辑错误 |
93 | 资源不可用 |
94 | 顺序记录不可用或并发 OPEN 错误 |
95 | 文件信息无效或不完整 |
96 | 没有该文件的 DD 语句 |
97 | OPEN 成功且文件完整性已验证 |
98 | 文件已锁定 - OPEN 失败 |
99 | 记录已锁定 - 记录访问失败 |