ファイル編成

ここでは、COBOL システムがサポートするファイル編成について説明します。

概要

ファイルはデータの集合で、通常はディスクに保存されています。論理エンティティとして、ファイルではデータを意味のあるグループに分割できます。たとえば、あるファイルに会社の製品情報をすべて保存し、別のファイルに社員情報を保存できます。物理エンティティとしてのファイルの編成について考慮する必要があります。ファイル編成とは、ファイルにデータを物理的に格納する方法を意味します。またファイル編成によって、データを呼び出す方法も決まります。

この COBOL システムでは、順ファイル編成、相対ファイル編成、索引ファイルの 3 つのファイル編成をサポートしています。ファイル編成に応じて、データを呼び出す方法が次の 3 通りあります。

ファイル構成 順呼び出し 乱呼び出し 動的呼び出し
順編成 不可 不可
相対編成
索引編成

順ファイル

順ファイルでは、個々のレコードを順番に呼び出します。つまり、ファイルに書き込まれた順番と同じ順番でレコードを呼び出します。新しいレコードは常にファイルの末尾に追加されます。

この COBOL システムでは、3 種類の順ファイルがサポートされています。

レコード順ファイル

デフォルトでは、ファイルを作成し、ファイル編成を順ファイルに指定すると、レコード順ファイルが作成されるため、レコード順ファイルは、ほとんどの場合「順ファイル」と呼ばれます。

ファイルをレコード順ファイルとして定義するには、COBOL プログラムでファイルに対して SELECT 句に ORGANIZATION IS RECORD SEQUENTIAL を指定します。たとえば、次のように指定します。

 select recseq assign to "recseq.dat"
     organization is record sequential.

デフォルトでは、順ファイルを指定するとレコード順ファイルが設定されるため、必ずしも ORGANIZATION IS RECORD SEQUENTIAL を指定する必要はありません。SEQUENTIAL コンパイラ指令を設定していない場合は、単に ORGANIZATION IS SEQUENTIAL と指定するのみでかまいません。

行順ファイル

行順ファイル (「テキストファイル」または「ASCII ファイル」とも呼ばれる) は、主に、表示専用データに使用します。「メモ帳」などのほとんどの PC エディタでは行順ファイルが作成されます。

行順ファイルでは、ファイルの各レコード間は、レコード区切り文字によって区切られています。レコード区切り文字は、復帰文字 (x"0D") と改行文字 (x"0A") で構成され、各レコードの空白文字を除く末尾文字の直後に挿入されます。WRITE 文は、データレコードから後続の空白文字を削除し、レコード区切り文字を追加します。READ 文は、レコード区切り文字を削除し、必要に応じて、データレコードを後続の空白文字で埋め、データを読み込むプログラムが定義するレコードサイズに合わせます。

ファイルを行順ファイルとして定義するには、COBOL プログラムでファイルに対して SELECT 句に ORGANIZATION IS LINE SEQUENTIAL を指定します。たとえば、次のように指定します。

 select lineseq assign to "lineseq.dat"
     organization is line sequential.

プリンタ順ファイル

プリンタ順ファイルは、直接、または、いったんディスクファイルにスプールして、プリンタに送信するファイルを指します。このファイルは、連続した印刷レコードから構成されており、レコード間に縦方向の位置を表す文字 (改行文字など) が入る場合があります。各印刷レコードは 0 個以上の印刷可能な文字で構成され、終端に復帰文字 (x"0D") が位置しています。

プリンタ順ファイルでは、OPEN 文によりファイルに x"0D" が書き込まれ、プリンタが最初の印刷レコードを印刷する前の最初の文字位置に配置されます。WRITE 文は、印刷レコードと末尾のキャリッジリターンコード (x"0D") をプリンタに書き込む前に、印刷レコードから後続空白を削除します。WRITE 文で BEFORE 句または AFTER 句を指定すると、印刷レコードの書き込み前または後に、プリンタに対して 1 つ以上の改行文字 (x"0A")、用紙送りコード (x"0C")、または縦方向のタブコード (x"0B") を送信できます。

プリンタ順ファイルを、入力ファイル (INPUT) または入出力両用ファイル (I/O) として開かないでください。

ファイルをプリンタ順ファイルとして定義するには、SELECT 句で ASSIGN TO LINE ADVANCING FILE または ASSIGN TO PRINTER と指定します。たとえば、次のように指定します。

 select printseq
     assign to line advancing file "printseq.dat".

相対ファイル

相対ファイルは、各レコードをファイル内の順位 (レコード 1、レコード 2 のように) によって識別するファイルです。つまり、レコードに対して、順番に呼び出すことも、ランダムに呼び出すこともできます。

相対ファイルの呼び出しは、レコードをランダムに呼び出せるため、高速化されます。

相対ファイルに対して可変長レコードを宣言することは可能ですが、システムはファイルへの WRITE 文で最大のレコード長を仮定して、使用しない文字位置まで埋めてしまうので、ディスク領域は無駄になります。このような処理を行う理由は、COBOL ファイル処理ルーチンが、ファイルでレコード番号を指定されたレコードの物理的な位置をすばやく計算するためです。

相対ファイルには、常に固定長レコードが含まれるため、データ圧縮を指定しても領域を節約することはできません。ファイルハンドラでは、相対ファイルにデータ圧縮を指定しても無効になります。

相対ファイルの各レコードの後には 2 バイトのレコードマーカーがあり、レコードの現在の状態を示します。レコードマーカーが示す状態は、次のとおりです。

x"0D0A" - レコードは存在します。

x"0D00" - レコードは削除されたか、書き込まれていません。

相対ファイルからレコードを削除しても、レコードの内容はすぐには削除されません。レコードのレコードマーカーが削除済みとして更新されます。ただし、削除されたレコードの内容は、物理的には新しいレコードが書き込まれるまでそのまま残ります。セキュリティ上の理由からデータをファイルから削除する必要がある場合は、次の手順に従ってください。

  1. REWRITE を使用して、レコードを空白などで上書きします。
  2. レコードを削除します。

相対ファイルを定義するには、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 を指定した場合は、順呼び出しと乱呼び出しの両方でファイルを呼び出せます。

索引ファイル

索引ファイルでは、各レコードが主キーを持っています。各レコードを互いに区別するために、主キーの値は各レコードに対して一意でなければなりません。レコードの主キーの値を指定すると、レコードをランダムに呼び出せます。索引ファイルのレコードは順呼び出しも可能です。

索引ファイルでは、主キーの他に、副キーと呼ばれる追加キーを指定できます。レコードの副キーの値は一意である必要はありません。

ファイルを索引ファイルとして定義するには、COBOL プログラムでファイルに対して SELECT 句に ORGANIZATION IS INDEXED を指定します。また、RECORD KEY 句を使用して主キーも指定する必要があります。

 select idxfile assign to "idx.dat"
    organization is indexed
    record key is idxfile-record-key.

実際には、ほとんどの索引ファイルは、データファイル (レコードデータを含む) と索引ファイル (索引構造体を含む) という 2 つの別のファイルで構成されます。その場合、COBOL プログラムで指定した名前はデータファイル名になります。関連付けられる索引ファイルの名前は、データファイル名に .idx という拡張子が追加されて作成されます。他の用途に拡張子 .idx を使用しないでください。

索引はレコードが追加されると大きくなる逆ツリー構造として構築されます。

索引ファイルでは、ランダムに選択したレコードを検索するためのディスクアクセス回数は、主にファイルのレコード数とレコードキーの長さによって決まります。 ファイルの入出力は、ファイルを順に読み込んでいく場合よりも高速になります。

すべての種類のファイルを定期的にバックアップすることをお奨めしますが、索引ファイルでは、2 つのファイルのうちのどちらかのみが使用できなくなる場合 (媒体の破損など) があります。索引ファイルを損失した場合は、Rebuild ユーティリティを使用して、データファイルから索引を復元して、障害復帰に必要な時間を短縮できます。詳細は、『Rebuild』の章を参照してください。

主キー

索引ファイルの主キーを定義するには、SELECT 句で RECORD KEY IS 句を使用します。

 select idxfile assign to "idx.dat"
     organization is indexed
     record key is idxfile-record-key.
        

副キー

各レコードには、主キーの他に、副キーと呼ばれる追加のキーを必要な数のみ指定できます。副キーを定義するには、SELECT 句で ALTERNATE RECORD KEY IS 句を使用します。

 select idxfile assign to "idx.dat"
     organization is indexed
     record key is idxfile-record-key
     alternate record key is idxfile-alt-key.
        

重複キー

重複した値を持つキーを定義できます。ただし、レコードの主キーの値は一意でなければならないため、主キーは重複させることができません。

重複キーを使用する場合は、各キーに同じ値を指定できる回数が制限されることに注意してください。重複キーに同じ値を指定するたびに、キーの出現番号が 1 ずつ増えます。個々のキーで値を重複させられる最大回数は、索引ファイルの種類によって異なります。 索引ファイルの種類とその特徴の詳細なリストについては、ヘルプトピック『索引ファイルの種類』を参照してください。

COBOL システムは、重複キーレコードを作成順に読み込むために出現番号を使用します。そのため、削除したレコードの出現番号を再使用できません。 つまり、一部のキーをすでに削除した場合は、重複値の最大回数に到達する可能性があります。

索引ファイルの種類によっては、データファイルに重複レコードを持つものがあります。索引ファイルに重複レコードが含まれている場合は、データファイルの各レコードの後に、システムレコードが続きます。このシステムレコードには、そのレコードの各重複キーに対するキーの出現番号が保持されます。この番号は、ファイルの履歴で、あるキー値が使用された回数を示すカウンタに過ぎません。重複レコードが存在すると、レコードに対する REWRITE 操作と DELETE 操作がより高速になりますが、このようなファイルのデータレコードは標準的なファイルのデータレコードよりも大きくなります。

副キーに重複した値を指定するには、SELECT 句の ALTERNATE RECORD KEY 句に WITH DUPLICATES を使用します。

 file-control.
     select idxfile assign to "idx.dat"
         organization is indexed
         record key is idxfile-record-key
         alternate record key is idxfile-alt-key 
                                 with duplicates.

スパースキー

スパースキーを設定すると、指定した値に対する索引エントリがファイルに格納されません。 たとえば、すべて空白文字であるキーをスパースキーとして定義した場合は、空白文字しかないデータ項目を持つレコードが、そのキーの索引エントリとしてファイルに格納されることはありません。

スパースキーとして指定できるのは、副キーのみです。

この機能を使用すると、索引ファイルを小さくできます。 キーが大きくなり、副キーに指定した値を持つレコードの数が増えた場合には、多くのディスク容量を節約できます。

スパースキーを有効化するには、SELECT 句 の ALTERNATE RECORD KEY 句で SUPPRESS WHEN ALL を使用します。

 file-control.
     select idxfile assign to "idx.dat"
     organization is indexed
     record key is idxfile-record-key
     alternate record key is idxfile-alt-key
                                 with duplicates.
                                 suppress when all "A".

この例では、副キーの値がすべて A であるレコードが書き込まれた場合には、実際のキーの値は索引ファイルに格納されません。

索引ファイルの呼び出し

主キーと副キーの両方を使用して、直接 (乱呼び出し)、またはキーの順番で (順呼び出し)、索引ファイルからレコードを読み込むことができます。 呼び出し法は、次のとおりです。

索引ファイルの呼び出し法は、SELECT 句で ACCESS MODE IS 句を使用して定義します。たとえば、次のように指定します。

 file-control.
     select idxfile assign to "idx.dat"
         organization is indexed
         access mode is dynamic
         record key is idxfile-record-key
         alternate record key is idxfile-alt-key.

固定長レコードと可変長レコード

ファイルには次のレコードを含めることができます。

可変長レコードを使用すると、ディスク領域を節約できることがあります。 固定長レコードを使用する場合は、固定レコード長を最長のレコード長に合わせる必要があります。 アプリケーションが生成するレコードのうち、短いレコードが多く、長いレコードが少ない場合は、固定長レコードでは大量のディスク領域を無駄にするため、可変長レコードの方がより適しています。

レコードの種類は、次のように指定します。

使用するレコード 指定する句
可変長レコード RECORDING MODE IS V
固定長レコード RECORDING MODE IS F

または

使用するレコード 指定する句
可変長レコード RECORD IS VARYING
固定長レコード RECORD CONTAINS n CHARACTERS

または

使用するレコード 指定するコンパイラ指令
可変長レコード RECMODE"V"
固定長レコード RECMODE"F"

または、可変長レコードを使用する場合は、RECMODE"OSVS" コンパイラ指令と次のどちらかを指定します。

ファイルヘッダー

ファイルヘッダーは、ファイルの先頭にある 128 バイトのブロックです。次のファイル構造のファイルにはファイルヘッダーが付いています。

さらに、これらのファイルでは、各レコードの先頭に 2 バイトまたは 4 バイトのレコードヘッダーが付きます。

ファイルヘッダー、レコードヘッダー、およびヘッダーを持つファイルの構造の詳細については、ヘルプトピック『ヘッダーをもつファイル』を参照してください。

関連情報
はじめに
ファイル名
ファイル状態
ファイルの共有
ファイルハンドラの構成
ファイルハンドラおよびソート API
データとキーの圧縮
ファイル操作のトレース