【実務・中級編】ON ENDFILE条件によるファイル読み込み終了の制御構造 – PL/Iの基本構文とデータ制御実践ガイド

現場の技術者へ:PL/IにおけるENDFILE制御の「深淵」と「鉄則」

現場で長年バッチプログラムをいじっていると、ふと「なぜこの処理が動いているのか」という根本的な部分で足元をすくわれることがある。特に、VSAMや順次データセットを読み込む際の`ON ENDFILE`の挙動は、まさにその筆頭だ。

若手が書いたコードで、`READ`文の直後に「もしEOFなら…」というロジックを詰め込みすぎて、スパゲッティ化しているのを見かける。PL/Iには、もっとエレガントで、かつ堅牢な「例外処理の流儀」がある。今日は、枯れた技術だからこそ知っておくべき、`ENDFILE`制御の極意を伝授しよう。

ON ENDFILEの基本:制御フローを理解する

まず大前提として、PL/Iの`ON ENDFILE(ファイル名)`は、単なる条件分岐ではない。「イベント駆動型の割り込み」であるという認識を持ってほしい。

通常の高級言語に見られる `IF EOF THEN…` といった逐次的な判定とは異なり、`ON`ユニットは、実行時環境(ランタイム)がファイル終端を検知した瞬間に、メインルーチンの実行を中断し、定義されたコードブロックへ「ジャンプ」する。

基本構造のサンプル

1
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

/ ファイルの定義 /
DCL IN_FILE FILE RECORD INPUT ENV(VSAM);
DCL EOF_FLAG BIT(1) INIT(‘0’B);

/ ENDFILE時の挙動を定義 /
ON ENDFILE(IN_FILE) BEGIN;
EOF_FLAG = ‘1’B; / フラグを立ててメイン処理へ戻る /
END;

OPEN FILE(IN_FILE);

/ メインの読み込みループ /
DO WHILE (EOF_FLAG = ‘0’B);
READ FILE(IN_FILE) INTO(REC_BUFFER);

IF EOF_FLAG THEN LEAVE; / EOFならループを抜ける /

/ ここに実業務ロジックを記述 /
END;

CLOSE FILE(IN_FILE);

END MAIN_PROC;

ここで重要なのは、`BEGIN; … END;` ブロック内で何をするかだ。単に`GO TO`でループの外へ飛ばす古い書き方も存在するが、現在の標準ではフラグ制御によるループ脱出が最もデバッグしやすく、メンテナンス性も高い。

実践的なトラブルシューティング:SIGNAL ENDFILEの活用

なぜ私が「フラグ制御」を推奨するか。それは、「テストの再現性」にある。

本番環境で「最後のレコードを読み込んだ直後の挙動」をデバッグしたいとき、わざわざ巨大なテストデータを用意する必要はない。`SIGNAL ENDFILE(IN_FILE);` をコードの適当な場所に差し込むだけで、擬似的にファイル終端状態をシミュレーションできるからだ。

1
/ テスト用デバッグコード(本番リリース時は削除) /
IF DEBUG_MODE THEN DO;
SIGNAL ENDFILE(IN_FILE); / 強制的にENDFILE条件を発生させる /
END;

この手法を知っていると、バッチの異常終了処理(リカバリ処理)のテストが劇的に楽になる。特に、ファイルが空だった場合や、特定のレコード数で処理を打ち切る際の挙動を確認する際、現場ではこの「自作のSIGNAL」が命を救う。

現場のエンジニアが陥りやすい罠

1. ONユニットのスコープ
`ON`ユニットは、そのプロシージャ内だけでなく、呼び出された子プロシージャにも引き継がれる。不用意に複数の場所で同じファイルに対する`ON`ユニットを定義すると、どのルーチンでキャッチされるか制御不能になる。「`ON`はメインルーチンで一元管理する」のが、大規模改修を生き抜くための鉄則だ。

2. REVERTの重要性
特定の処理区間だけ別の例外処理を行いたい場合は、`REVERT ENDFILE(IN_FILE);` を使うことを忘れてはいけない。これを怠ると、意図しない場所で古い`ON`ユニットが発火し、原因不明の無限ループや異常終了に繋がる。

3. READの戻り値とBUILTIN関数
`ONCODE`や`ONFILE`といったビルトイン関数を`ON`ユニット内で活用しよう。エラー発生時のファイル属性や終了コードをログに出力しておけば、後で運用担当から「深夜にバッチが止まった」と泣きつかれた際、即座に原因を切り分けられる。

最後に:枯れた技術こそ、美しく

PL/Iは古い言語だ。しかし、その例外処理モデルは、現代の言語における`Try-Catch`の先駆けであり、極めて洗練されている。

後輩諸君、コードを書くときは「何が起こるか」だけでなく、「エラーが起きたとき、プログラムはどうあるべきか」を常に想像してほしい。`ENDFILE`を制御できるということは、そのプログラムの生命線(ライフサイクル)を支配しているということと同義だ。

今日学んだ構造をベースに、堅牢で美しいバッチコードを追求してくれ。それが、我々メインフレームエンジニアの誇りである。

タイトルとURLをコピーしました