
- 學習 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 | 記錄已鎖定 - 記錄訪問失敗 |