A relative file is a file in which each record is identified by its ordinal position in the file (record 1, record 2 and so on). This means that records can be accessed randomly as well as sequentially:
Because records can be accessed randomly, access to relative files is fast.
Although you can declare variable length records for a relative file, this can be wasteful of disk space because the system assumes the maximum record length for all WRITE statements to the file and pads the unused character positions. This is done so that the COBOL file handling routines can quickly calculate the physical location of any record, given the record's record number in the file.
As relative files always contain fixed length records, no space is saved by specifying data compression. In fact, if data compression is specified for a relative file, it is ignored by the File Handler.
Each record in a relative file is followed by a two-byte record marker which indicates the current status of the record. The status of a record can be:
x"0D0A" (Windows) or x"0A" (UNIX) - record present
x"0D00" (Windows) or x"00" (UNIX) - record deleted or never written
When you delete a record from a relative file, the record's contents are not removed immediately. The record's record marker is updated to show that it has been deleted, but the contents of the deleted record remain physically in the file until a new record is written. If you need to remove the data from the file for security reasons, follow the procedure below:
To define a relative file, specify ORGANIZATION IS RELATIVE in the SELECT clause for the file in your COBOL program.
To access records randomly, you must also:
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.
The example code above defines a relative file. The access mode is random and so a relative key relfil-key is defined. For random access, you must always supply a record number in the relative key, before trying to read a record from the file.
If you specify ACCESS MODE IS DYNAMIC, you can access the file both sequentially and randomly.