【PL/I深掘り】ON ENDFILEはなぜ「フラグ管理」が正義なのか?現場で迷わない制御フローの極意
メインフレームのバッチ改修現場で、若手から一番よく受ける質問がこれだ。「`ON ENDFILE`をどう書くのが一番安全ですか?」というもの。
教科書的なリファレンスをなぞるだけなら簡単だ。だが、何百万件ものVSAMレコードを処理し、途中で異常終了が許されない基幹バッチの世界では、この「ファイル終了制御」一つがシステムの堅牢性を左右する。今日は、現場のベテランが必ず守っている、読みやすく、デバッグしやすい標準的な制御構造について、その「作法」を伝授しよう。
—
1. なぜ「ONユニット」の中で直接処理をしてはいけないのか
多くの初心者がやりがちな失敗が、`ON ENDFILE`のブロック内に直接`READ`文や出力処理を記述してしまうことだ。これはコードが複雑化するだけでなく、実行パスが不明瞭になり、後からデバッグする人間を地獄に突き落とすことになる。
基本は「フラグのセット」と「メインループへの復帰」。これに尽きる。ONユニットはあくまで「事象の検知」に徹し、実際の制御フローはメインの読み込みループ内で完結させるべきだ。
2. 実践的コーディング:推奨されるテンプレート
以下に、実務でそのまま使える堅牢なループ構造を示す。ポイントは`EOF_SW`というフラグを明示的に定義し、それを起点にループを制御することだ。
/i
/ ————————————————————- /
/ プログラム名: BATCH001.PLI /
/ 目的: VSAMファイルを読み込み、終了フラグでループを制御 /
/ ————————————————————- /
BATCH001: PROCEDURE OPTIONS(MAIN);
/ ファイル終了判定フラグ (BIT(1)はメモリ効率が良く、フラグには最適) /
DCL EOF_SW BIT(1) INIT(‘0’B);
DCL IN_FILE FILE RECORD INPUT;
/ ONユニットの定義:ファイル終了時にフラグを立てる /
ON ENDFILE(IN_FILE) EOF_SW = ‘1’B;
/ ファイルのオープン /
OPEN FILE(IN_FILE);
/ 最初のリード(ループ前読み) /
READ FILE(IN_FILE) INTO(IN_REC);
/ メインループ:EOFフラグが立つまで回す /
DO WHILE(^EOF_SW);
/ ここにロジックを記述 /
CALL PROCESS_DATA(IN_REC);
/ 次のレコードを読み込む /
READ FILE(IN_FILE) INTO(IN_REC);
END;
/ 後処理 /
CLOSE FILE(IN_FILE);
RETURN;
/ ロジック処理用外部プロシージャ等の定義 /
PROCESS_DATA: PROCEDURE(REC);
DCL REC CHAR(100);
/ 処理内容 /
END PROCESS_DATA;
END BATCH001;
3. ここがプロのこだわり:デバッグと可読性のポイント
コードを見て気づいたかもしれないが、あえて「前読み(ループ前のREAD)」を採用している。
- なぜ前読みか?
`DO WHILE`のループ内で`READ`を行えば、ループの先頭で必ず終了判定が行われる。これにより、「ファイルが空だった場合」の挙動も自然に処理できるからだ。ループの途中で変に`IF`文を入れて終了判定をするよりも、圧倒的にバグが混入しにくい。
- フラグ管理の利点
`EOF_SW`を`BIT(1)`で宣言しているのは、単なる習慣ではない。メインフレームの限られたメモリリソースを節約しつつ、論理的な真偽値として最も直感的に扱えるからだ。また、大規模な改修時に「ファイルが終了したのか」「エラーが発生したのか」を判別するための拡張(例えば`ERROR_SW`を追加する等)が容易になる。
- BUILTIN関数の活用
もしVSAMのレコード長が可変であれば、`STG`や`LENGTH`、あるいは`ONCODE`関数を組み合わせることで、より高度な例外処理が可能になる。だが、まずはこの「フラグ制御」という基本を徹底してほしい。
4. 最後に:現場のエンジニアへ
PL/IのONユニットは、非常に強力な機能だが、使い方を誤ると「制御フローが見えないブラックボックス」になってしまう。
「動けばいい」というコードではなく、「次にこのソースを触る人が、どこで何が起きているか一目でわかるコード」を目指してほしい。特に、複数のファイル入出力を伴うバッチでは、このフラグ管理の徹底が、トラブル発生時の調査時間を劇的に短縮する。
もし、レガシーコードの解析で複雑な`GO TO`や、ネストされた`ON`ユニットに遭遇して頭を抱えたときは、この記事の構造を思い出してほしい。リファクタリングの第一歩は、常に「読みやすく、制御しやすいループ構造」への回帰から始まるものだ。
さて、次はVSAMの`ON KEY`条件の扱いについて深掘りしようか。あれもまた、現場のエンジニアを悩ませる奥深いテーマだからな。
