前ページへはじめに ファイル名次ページへ

第 2 章 ファイル編成

ファイルはデータの集合で、通常はディスクに保存されています。論理的なファイルでは、データを意味のあるグループに分割することができます。例えば、あるファイルに会社の製品情報をすべて保存し、別のファイルにすべての社員情報を保存することができます。物理的なとして、ファイルはその編成に関連して考える必要があります。

2.1 ファイル編成

「ファイル編成」という用語は、ファイルにデータを格納する方法を意味します。また、データへのアクセス方法も意味します。この COBOL システムでは、順ファイル、相対ファイル、索引ファイルの 3 つのファイル編成をサポートしています。

2.1.1 順ファイル

順ファイルでは、個々のレコードへ順番にアクセスします。つまり、最初にファイルに書き込まれた順番と同じ順番でレコードにアクセスします。新しいレコードは常にファイルの末尾に追加されます。

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

2.1.1.1 レコード順ファイル

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

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

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

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

2.1.1.2 行順ファイル

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

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

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

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

2.1.1.3 プリンタ順ファイル

プリンタ順ファイルは、直接、または、いったんディスクファイルにスプールして、プリンタに送信するファイルを指します。このファイルは、連続した印刷レコードから構成されており、レコード間に縦方向の位置を表す文字 (ラインフィードなど) が入る場合があります。 印刷レコードは、印刷可能な文字で構成され、キャリッジリターン (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".

2.1.2 相対ファイル

相対ファイルは、各レコードをファイル内の順位 (レコード 1、レコード 2 のように) によって識別するファイルです。つまり、レコードに対して、順番にアクセスすることも、ランダムにアクセスすることもできます。順アクセスでファイルの次のレコードにアクセスするには、READ 文または WRITE 文を実行するだけです。ランダムアクセスでは、相対キーとしてデータ項目を定義し、データ項目の中で、READ または WRITE の対象とするレコードの序数を指定する必要があります。

相対ファイルのレコードの物理的な位置は、そのキーから直接計算できるため、相対ファイルへのアクセスは高速です。

相対ファイルに対して可変長レコードを宣言することは可能ですが、システムはファイル内のすべてのレコードに対し最大レコード長を割り当て、使用しない文字位置まで埋めてしまうため、ディスク領域が無駄に使用される可能性があります。これは、レコードのキーと位置の固定関係を保持するために実行されます。

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

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

x"0D0A" - レコードが存在する。

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

相対ファイルからレコードを削除すると、レコードのレコードマーカが更新され、削除済みの記録が表示されます。ただし、削除されたレコードの内容は、物理的には新しいレコードが書き込まれるまでそのまま残ります。セキュリティの観点から実際のデータをファイルに残さないようにするには、削除する前に REWRITE を使用してレコードを上書きする必要があります (例えば、空白文字などを使用する)。

相対ファイルを定義するには、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 を指定した場合は、順アクセスとランダムアクセスの両方でファイルへアクセスすることができます。

2.1.3 索引ファイル

索引ファイルでは、各レコードが主キーを持っています。各レコードを互いに区別するために、主キーの値は各レコードに対して一意でなければなりません。この条件が満たされている場合、レコードの主キーの値を指定すると、レコードへランダムにアクセスできます。索引ファイルのレコードへも順アクセスすることが可能です。索引ファイルでは、主キーの他に、副キーと呼ばれる追加キーを指定することができます。レコードの副キーの値は一意である必要はありません。

ファイルを索引ファイルとして定義するには、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 ユーティリティを使用して、データファイルから索引を回復し、障害復帰に必要な時間を短縮することが可能です。

2.1.3.1 主キー

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

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

2.1.3.2 副キー

各レコードには、主キーの他に、副キーと呼ばれる追加のキーを必要な数だけ指定できます。副キーは、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.

2.1.3.3 重複キー

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

重複キーを使用する場合は、各キーに同じ値を指定できる回数が制限されることに注意してください。重複キーに同じ値を指定するたびに、キーの出現番号が 1 ずつ増えます。個々のキーで値を重複させられる最大回数は、索引ファイルの種類によって異なります (索引ファイルの種類とその特徴の詳細リストについては、『ファイル構造』の章の『索引ファイル』の節を参照してください)。 出現番号は、重複キー レコードを作成順に読み込むために使用します。そのため、削除したレコードの出現番号を再使用することはできません。つまり、一部のキーをすでに削除した場合でも、重複値の最大出現回数に到達する可能性があることを意味します。

索引ファイルの種類によっては、データファイルに重複レコードを持つものがあります (索引ファイルの種類とその特徴の詳細リストについては、『ファイル構造』の章の『索引ファイル』の節を参照してください)。このようなファイルでは、データファイルの各レコードの後に、そのレコードの重複キーに対するキーの出現番号を示すシステムレコードが続きます。この番号は、ファイルの履歴で、あるキー値が使用された回数を示すカウンタに過ぎません。重複レコードが存在すると、レコードに対する 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.

2.1.3.4 スパース (疎) キー

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

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

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

スパース キーを有効化するには、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 であるレコードが書き込まれた場合は、実際のキーの値が索引ファイルに格納されません。

2.1.3.5 索引ファイルへのアクセス

主キーと副キーの両方を使用して、直接 (ランダムアクセス)、またはキーの順番にしたがって (順アクセス)、索引ファイルからレコードを読み込むことができます。アクセス モードは、次のとおりです。

索引ファイルへのアクセス方法は、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.

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

ファイルには、固定長レコード (すべてのレコードが全く同じ長さである場合) か、可変長レコード (各レコードの長さが異なる場合) を含めることができます。可変長レコードを使用すると、ディスク領域を節約することができます。例えば、アプリケーションが生成するレコードのうち、短いレコードが多く、長いレコードが少ない場合に、固定長レコードを使用すると、固定長を最長のレコード長に合わせる必要があります。固定長レコードの場合は、このように大量の無駄なディスク領域を使用するため、可変長レコードを使用した方が有利です。

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

上記のいずれにも該当しない場合は、以下のようになります。

上記のいずれにも該当しない場合は、以下のようになります。

上記のいずれにも該当しない場合は、以下のようになります。

2.3 ファイルヘッダー

ファイルヘッダーは、ファイルの先頭にある 128 バイトのブロックです。索引ファイル、可変長レコードをもつレコード順ファイル、可変長レコードをもつ相対ファイルは、すべてファイルヘッダーを持っています。さらに、これらのファイルでは、各レコードの先頭に 2 バイトまたは 4 バイトの レコードヘッダーが付きます。

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


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。

前ページへ はじめに ファイル名次ページへ