相対ファイルは、各レコードをファイル内の順位 (レコード 1、レコード 2 のように) によって識別するファイルです。つまり、レコードに対して、順番に呼び出すことも、ランダムに呼び出すこともできます。
相対ファイルの呼び出しは、レコードをランダムに呼び出せるため、高速化されます。
相対ファイルに対して可変長レコードを宣言することは可能ですが、システムはファイルへの WRITE 文で最大のレコード長を仮定して、使用しない文字位置まで埋めてしまうので、ディスク領域は無駄になります。このような処理を行う理由は、COBOL ファイル処理ルーチンが、ファイルでレコード番号を指定されたレコードの物理的な位置をすばやく計算するためです。
相対ファイルには、常に固定長レコードが含まれるため、データ圧縮を指定しても領域を節約することはできません。ファイル ハンドラーでは、相対ファイルにデータ圧縮を指定しても無効になります。
相対ファイルの各レコードの後には 2 バイトのレコード マーカーがあり、レコードの現在の状態を示します。レコード マーカーが示す状態は、次のとおりです。
x"0D0A" - レコードが存在する。
x"0D00" - レコードが削除されたか、書き込まれていない。
相対ファイルからレコードを削除しても、レコードの内容はすぐには削除されません。レコードのレコード マーカーが削除済みとして更新されます。ただし、削除されたレコードの内容は、物理的には新しいレコードが書き込まれるまでそのまま残ります。セキュリティ上の理由からデータをファイルから削除する必要がある場合は、次の手順に従ってください。
相対ファイルを定義するには、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 を指定した場合は、順呼び出しと乱呼び出しの両方でファイルを呼び出すことができます。