PL/I プログラムで使用するファイルには、PL/I ファイル名 が付いています。 プログラムの外部で存在する物理データ・セットの名前は、 オペレーティング・システムが認識できる名前、すなわち、データ・セット名 または dsname をとります。 名前のないデータ・セットもあります。その場合、 データ・セットはそのデータ・セットが設定されている装置によってシステムに認識されます。
オペレーティング・システムには、 使用しているプログラムが参照する物理データ・セット を識別する手段が必要なので、PL/I ファイル名を dsname に関連付ける、 プログラムにとっては外部のデータ定義 つまり DD ステートメント を記述する必要があります。 例えば、次のようなファイル宣言が使用しているプログラムに設定されているとします。
DCL STOCK FILE STREAM INPUT;
この PL/I ファイル名に対応するデータ定義名 (ddname) を指定して DD ステートメントを作成しなければなりません。 つまり、DD ステートメントにより物理データ・セット名 (dsname) が指定され、 その特性が指定されます。
//GO.STOCK DD DSN=PARTS.INSTOCK, . . .
DD ステートメントの書き方については本書にも記述されていますが、 詳細は使用しているシステムのジョブ制御言語 (JCL) 解説書を参照してください。
データ・セットを PL/I ファイルに関連付ける方法は、いくつかあります。 データ・セットを PL/I ファイルに関連付けるには、 データ・セットを定義する DD ステートメントの dd 名を、 次のいずれかと同じになるように指定します。
また、対応する dd 名が次の条件を満たすように、PL/I ファイル名を選択する必要があります。
外部名は 7 文字までに限定されているため、7 文字を超える 外部ファイル名は、そのファイル名の最初の 4 文字と 最後の 3 文字を連結したものに短縮されます。 しかしこのような短縮名は、関連 DD ステートメント内で dd 名 として使用される名前ではありません。
次の 3 つのステートメントを見てみましょう。
ステートメント番号 1 を実行すると、ファイル名 MASTER は現行ジョブ・ ステップの DD ステートメントの dd 名と同じであると見なされます。 ステートメント番号 2 を実行すると、ファイル名 OLDMASTE は現行ジョブ ・ステップの DD ステートメントの dd 名と同じであると見なされます。 (ファイル名の最初の 8 文字が dd 名になります。 例えば、OLDMASTER が外部名であるとすると、 プログラム内ではコンパイラーによって短縮された OLDMTER という名前が使われます。) ステートメント番号 3 を使ってファイル DETAIL を暗黙的にオープンする場合、 ファイル名 DETAIL は現行ジョブ・ステップの DD ステートメントの dd 名と同じであると見なされます。
上記の場合はいずれも、対応する DD ステートメントが ジョブ・ストリーム内に存在しなければなりません。 それが存在しないと、UNDEFINEDFILE 条件が発生します。 上記 3 つの DD ステートメントは、次のように始まります。
ファイルを明示的あるいは暗黙的にオープンするステートメント内のファイル参照 がファイル定数でない場合は、その DD ステートメント名はファイル参照の値 と同じでなければなりません。 次の例は、DD ステートメントをどのようにファイル変数の値と関連付けるかを示します。
DCL PRICES FILE VARIABLE,
RPRICE FILE;
PRICES = RPRICE;
OPEN FILE(PRICES);
上記の DD ステートメントは、 データ・セットをファイル定数 RPRICE と関連付けるはずです。 このファイル定数は、ファイル変数 PRICES の値です。したがって、次のようになります。
//RPRICE DD DSNAME=...
また、ファイル変数を使えば、1 つのステートメントで、いくつもの ファイルを何回も処理することができます。 次に例を示します。
DECLARE F FILE VARIABLE,
A FILE,
B FILE,
C FILE;
.
.
.
DO F=A,B,C;
READ FILE (F) ...;
.
.
.
END;
上記の場合、READ ステートメントにより 3 つのファイル A、B、C が読 み取られ、各ファイルをそれぞれ異なるデータ・セットに関連付けることができます。 ファイル A、B、C は、それぞれの場合にこの READ ステートメントが実行されたあとも、 オープンの状態に保たれます。
次の OPEN ステートメントは、TITLE オプションの使用を示したものです。
OPEN FILE(DETAIL) TITLE('DETAIL1');このステートメントを正常に実行するには、 現行ジョブ・ステップ内に dd 名が DETAIL1 の DD ステートメントがなければなりません。 このステートメントは、次のように始まります。
//DETAIL1 DD DSNAME=DETAILA,...
このように、dd 名 DETAIL1 を使ってデータ・セット DETAILA をファイル DETAIL に関連付けます。