区分データ・セット (PDS) と拡張区分データ・セット (PDSE) は、メンバー と呼ばれるいくつかの部分に 分割されている DASD データ・セットです。 各メンバーには、それぞれ固有の 1~8 文字の名前によって 個別にアクセスできます。 表 1 が示すように、PDSE は PDS に似ていますが、多くの拡張を含んでいます。
| PDSE の特性 | PDS の特性 |
|---|---|
| データ・セットの限界は 123 エクステント | データ・セットの限界は 16 エクステント |
| ディレクトリーは無制限で、メンバー名により索引付けされる。ディレクトリー検索が高速 | 固定サイズのディレクトリーを順次検索 |
| PDSE は装置独立であり、レコードは再ブロック化可能 | ブロック・サイズは装置に依存 |
| 動的スペース割り振りと 動的スペース・レクラメーションを使用 | スペースをレクラメーションするには IEBCOPY COMPRESS の使用が必要 |
| 同時に 複数のメンバーの作成をサポート* | 同時に 1 つのメンバーの作成しかサポートされない |
注: *z/OS® XL C/C++ では、PDSE の 2 つの別個メンバーをオープンして、同時に書き込むことができます。
しかし、単一のメンバーを書き込み用に 2 回以上
オープンすることはできません。
|
|
//MYDD DD DSN=userid.MY.DATA(A),DISP=SHR
fp = fopen("dd:MYDD(B)","r");
PDS または PDSE のメンバーをモード a、ab、a+、a+b、w+、w+b、または wb+ を使用してオープンすることはできません。 w+ または wb+ モードと同じことを実行したいなら、まずファイルを w または wb モードでオープンし、それに書き込みを行ってからそれをクローズしてください。 その後、そのファイルを r+ または rb+ モードで 再度オープンすることによって更新を実行できます。 C ライブラリー関数 ftell() または fgetpos() を使用するなら、後でメンバーを更新する時のためにファイル位置を取得できます。 通常、ファイルを r+ または rb+ モードで オープンした場合、その終わりに書き込むことによってファイルを 拡張できます。しかし、それらのモードを使用しても、メンバーを拡張することはできません。 そのようにするには、古いメンバーの内容に拡張内容を加えたものを、新しいメンバーにコピーする必要があります。 remove() 関数を使用して古いメンバーを除去してから、rename() 関数を 使用して新しいメンバーを古いメンバーの名前に変更できます。
すべてのメンバーの、RECFM、LRECL、および BLKSIZE の属性はまったく同じものです。PDS の場合、異なる属性をもつメンバーを追加したり、FBS、FBSA、または FBSM の RECFM を指定することはできません。z/OS XL C/C++ は、指定された属性を検査します。
PDSE の場合、z/OS XL C/C++ は、指定されたすべての属性が、既存のデータ・セットの属性と確実に互換性があることを検査します。 互換性のある属性は、同じレコード・フォーマット (F、V、または U) および同じ LRECL を指定する属性です。PDSE はすべてのレコードを再ブロック化するため、属性に互換性がある限り、ブロック化または非ブロック化形式 のいずれかを選択できます。 例えば、FB LRECL=40 BLKSIZE=80 として PDSE を作成し、後にそれを FB LRECL=40 BLKSIZE=1600 また は F LRECL=40 BLKSIZE=40 として読み取り用に オープンできます。 LRECL は変更できず、BLKSIZE は RECFM および LRECL と互換性のあるものでなければなりません。また、PDSE の基本的な形式を、F から V へ あるいはその逆へ変更することはできません。 PDS または PDSE が既に存在している場合、z/OS XL C/C++ は既存の属性をデフォルトとして使用するため、どの属性も指定する必要はありません。
各区分データ・セットの開始位置には、そのディレクトリー、メンバー名を含む一連のレコード、およびデータ・セット内のメンバーごとの開始位置があります。 ディレクトリーには、メンバーを指定しなくても、PDS または PDSE の名前を 指定することによってアクセスできます。 ディレクトリーは読み取り用でしかオープンできません。更新モードと書き込みモードは指定できません。 ディレクトリー読み取り用に指定できる RECFM は、RECFM=U だけです。しかし、その RECFM を指定する必要はありません。なぜなら、z/OS XL C/C++ は U をデフォルトとして使用するからです。
「z/OS DFSMS データ・セットの使用法」に PDS と PDSE の 使用法についての図とさらに詳しい説明を記載しています。