レコード ファイルの属性

次の属性は、レコード ファイルでの使用に適しています。ファイル定数の DECLARE 文または OPEN 文のいずれかで使用される属性もあれば、OPEN 文のみで使用される属性もあります。一部の属性は、存在する場合、特定の他の属性が存在することを意味します。

属性 使用できる文      暗黙指定
RECORD DECLARE または OPEN  
INPUT DECLARE または OPEN  
OUTPUT DECLARE または OPEN  
UPDATE DECLARE または OPEN RECORD
SEQUENTIAL DECLARE または OPEN RECORD
KEYED DECLARE または OPEN RECORD
DIRECT DECLARE または OPEN RECORD KEYED
ENVIRONMENT      DECLARE  
TITLE OPEN  

INPUT、OUTPUT、UPDATE のいずれも指定されていない場合は、INPUT と想定されます。SEQUENTIAL、DIRECT のいずれも指定されていない場合は、SEQUENTIAL と想定されます。STREAM、RECORD のいずれも指定されていない場合は、デフォルトは STREAM になります(「ストリーム I/O」セクションを参照してください)。次の属性セットは相互に排他的です。

1 つのファイルに対する DECLARE 文および OPEN 文の両方で属性が指定されている場合、使用される属性は、2 つの文の属性の組み合わせになります。この組み合わせには、相互に排他的な各セットのうちの 1 つしか含めることはできません。

TITLE オプションは、PL/I プログラムで宣言されたファイルをオペレーティング システムで既知のファイルと関連付けるために使用します。OPEN 文の次の例では、TITLE オプションの引用符で囲まれたテキストは、FILE オプションで指定された PL/I ファイルのこのオープン処理を含む I/O 操作で使用されるシステム ファイル名を指定しています。OPEN 文で TITLE オプションが指定されていない場合、ファイル定数の宣言された名前がデフォルトのタイトルとして使用されます。

例:

OPEN FILE(F) RECORD OUTPUT TITLE('thedata');

OPEN FILE(F) RECORD INPUT; /* The default title is 'F' */

開かれていないファイルに対して READ、WRITE、REWRITE、または DELETE 文が実行された場合、そのファイルは、ファイル定数の宣言された名前をタイトルとして使用して、RECORD ファイルとして暗黙的に開かれます。暗黙的に開かれたファイルに割り当てられる属性は、次に示すように、使用されている I/O 文によって異なります。

レコード I/O 文      割り当てられる属性
READ RECORD INPUT
WRITE RECORD OUTPUT
REWRITE RECORD UPDATE
DELETE RECORD UPDATE

レコードの入出力操作は、特定の属性を使用して開かれたファイルに限定されます。次の表にこの制限を示します。

ファイル属性      許可された I/O 操作
INPUT READ
OUTPUT WRITE
UPDATE READ、WRITE、REWRITE、DELETE

INPUT または UPDATE 用に開かれたファイルが存在しない場合、エラーが通知されます。

OUTPUT 用に開かれたファイルが存在しない場合、ファイルが作成されます。DIRECT または KEYED SEQUENTIAL としてファイルが開かれた場合は、キー付きファイルが作成されます。それ以外の場合は、キー付きでないファイルが作成されます。

OUTPUT 用に開かれたファイルが既に存在する場合は、そのファイルが削除され、新しいファイルが作成されます。

ただし、ファイルを開くときに -APPEND オプションが指定されていると、既存のファイルを OUTPUT 用に開くことができます。既存のレコード ファイルにレコードを追加するには、OPEN 文の TITLE オプションで -APPEND オプションを使用します。したがって、追加するファイルの名前が「logfile」の場合は、次の TITLE オプションを使用してファイルを開きます。

TITLE ('logfile -APPEND') 

このファイルに対する後続の WRITE 文は、その出力をファイルの末尾に追加するだけです。

REWRITE 文は、UPDATE ファイルの既存のレコードを新しいレコードに置き換えます。DELETE 文は、基本的に、UPDATE ファイルから既存のレコードを削除します。既存のレコードへの WRITE および存在しないレコードからの READ は許可されません。EOF を過ぎたレコードへの WRITE は、ファイルの末尾にレコードを追加します。存在しないレコードの DELETE または REWRITE は KEY 条件を通知します(詳細については、「Statements」の章にある「ON」セクションの KEY に関する説明を参照してください)。

レコード I/O 文は、ファイル内のレコードに対して、またはレコードから、変数の記憶域をコピーします (局所モード I/O を使用する READ 操作の場合を除く。下記参照)。

変換は実行されず、読み取られるデータが変数に格納できる適切な型であることを確認するためのチェックも行われません。INTO または FROM オプションで使用する変数を、非整列ビット文字列または全体が非整列ビット文字列で構成される構造体にすることはできません。これは、そのような変数は、通常、同じ配列または構造体の他のメンバーと記憶域の一部を共有するためです。また、FROM または INTO オプションでは式を使用できません。

注:

UNION 属性を持つ構造体は、READ、WRITE、PUT、および GET 文で変数として使用することはできません。

READ 操作は、移動モードおよび局所モードの 2 つの「モード」で実行できます。INTO オプションを指定する READ 文では、INTO オプションで参照される変数に入力データが直接格納されます。これは、「移動モード」の READ と呼ばれます。INTO オプションの代わりに SET オプションを指定する READ 文では、名前のない記憶域バッファーに入力データが格納され、SET オプションで参照されるポインター変数にこのバッファーのアドレスが割り当てられます。これは、「局所モード」の READ と呼ばれます。

レコード I/O 文の詳細な説明については、「Statements」の章を参照してください。

例:

READ FILE(CUSTOMERS) KEY(CUST_ID) INTO(CUST_RECORD); 
PUT SKIP LIST(CUST_RECORD.NAME);
READ FILE(CUSTOMERS) KEY(CUST_ID) SET(CPTR); 
PUT SKIP LIST(CPTR->BASED_RECORD.NAME);