相対ファイルとは、各レコードをファイル内の順位 (レコード 1、レコード 2 など) によって識別するファイルです。そのため、レコードに対して順番に呼び出すことも、ランダムに呼び出すこともできます。
相対ファイルの呼び出しではレコードをランダムに呼び出せるため、処理が高速です。
相対ファイルに対して可変長レコードを宣言することは可能ですが、システムはファイルへの WRITE 文で最大のレコード長を仮定して、使用しない文字位置まで埋めてしまうため、ディスク領域が無駄になります。この処理は、COBOL ファイル処理ルーチンがファイル内のレコードのレコード番号を踏まえて、レコードの物理的な位置を迅速に計算するために行われます。
相対ファイルには常に固定長レコードが含まれるため、データ圧縮を指定してもディスク領域は節約できません。実際、相対ファイルにデータ圧縮を指定しても、ファイル ハンドラーは無視します。
相対ファイル内の各レコードの後には、レコードの現在の状態を示す 2 バイトのレコード マーカーがあります。レコード マーカーが示す状態は、次のいずれかです。
x"0D0A"(Windows) または x"0A"(UNIX) - レコードが存在する。
x"0D00"(Windows) または x"00"(UNIX) - レコードが削除されたか、書き込まれていない。
相対ファイルからレコードを削除しても、レコードの内容はすぐには削除されません。レコードのレコード マーカーが削除済みとして更新されます。ただし、削除されたレコードの内容は、物理的には新しいレコードが書き込まれるまでファイル内にそのまま残ります。セキュリティ上の理由からデータをファイルから削除する必要がある場合は、次の手順を行います。
相対ファイルを定義するには、COBOL プログラムでファイルに対して SELECT 句に ORGANIZATION IS RELATIVE を指定します。
レコードを乱呼び出しするには、次の手順も実行する必要があります。
次に例を示します。
select relfil assign to "relfil.dat" organization is relative access mode is random relative key is relfil-key. ... working-storage section. 01 relfil-key pic 9(8) comp-x.
上記のコード例では、相対ファイルを定義しています。呼び出しモードが乱呼び出しであるため、相対キー relfil-key を定義します。乱呼び出しの場合は常に、ファイルからレコードを読み込む前に、相対キーにレコード番号を指定する必要があります。
ACCESS MODE IS DYNAMIC を指定すると、順呼び出しおよび乱呼び出しの両方でファイルを呼び出すことができます。