導入
メインフレーム開発において、プログラムと外部データ(データセット)を繋ぐ「FILE属性」は、まさにシステムの心臓部です。なぜこの知識が重要かというと、プログラム内で定義された論理的な名前が、実行環境であるJCL(Job Control Language)とどう結びつくかを理解しない限り、安定したI/O処理は実現できないからです。本稿では、PL/IのFILE属性の基本から、現代的なシステム移行も見据えた設計のポイントを解説します。
基礎知識
PL/IにおけるFILE属性とは、プログラム内でデータセットを扱うための「論理的な窓口」です。プログラムは、このFILE属性で宣言された名前を通じてデータにアクセスしますが、実際の物理的な場所(どのディスクにあるか、どんなファイル形式か)は、実行時にJCLのDDステートメント(DD名)によって決定されます。
つまり、プログラムは「どのFILE属性を使うか」だけを知っていればよく、実際のファイルパスなどは外側から制御できるため、疎結合なシステム設計が可能になるのです。
実装/解決策
FILE属性を宣言する際は、データの処理形式(RECORD/STREAM)や入出力方向(INPUT/OUTPUT/UPDATE)を明確に指定します。
1. 宣言: DCLステートメントでFILE属性を指定。
2. JCLとの結合: 宣言した名前が、JCL上のDD名と一致している必要があります。
3. OPEN/CLOSE: 処理の開始と終了で明示的に制御を行うのが、メインフレームにおける堅牢なコーディングの定石です。
サンプルプログラム
以下は、入力ファイルを読み込み、その内容を標準出力へ書き出すシンプルなPL/Iプログラムの例です。
/ ファイル入出力の基本サンプル /
/ INFILEは入力ファイル、OUTFILEは出力ファイル /
DCL INFILE FILE RECORD INPUT;
DCL OUTFILE FILE RECORD OUTPUT;
DCL BUFFER CHAR(80);
/ ファイルをオープン /
OPEN FILE(INFILE), FILE(OUTFILE);
/ データの読み込みループ /
READ FILE(INFILE) INTO(BUFFER);
DO WHILE (SUBSTR(BUFFER,1,1) ^= ‘EOF’);
/ ここで何らかの処理を行う /
WRITE FILE(OUTFILE) FROM(BUFFER);
READ FILE(INFILE) INTO(BUFFER);
END;
/ ファイルをクローズ /
CLOSE FILE(INFILE), FILE(OUTFILE);
応用・注意点
現場で役立つ補足として、現代のクラウド環境やオープン系システムへの移行を考慮する場合、DI(Dependency Injection:依存性の注入)の考え方が重要になります。
メインフレームからS3バケットやローカルファイルシステムへ移行する場合、従来のJCLのDD名に相当する情報を、設定ファイルや環境変数から動的に読み込む工夫が必要です。また、陥りやすいバグとして「ファイルがクローズされていない」「DD名とプログラム内の名前の不一致によるABEND(異常終了)」があります。これらを防ぐため、エラーハンドリング(ON ENDFILEなど)を適切に実装し、ファイル操作の前後には必ずステータスチェックを行うことを強く推奨します。

コメント