【実務・中級編】ON ENDFILEユニットによるファイル終了制御 – PL/Iの基本構文とデータ制御実践ガイド

現場で泣かないためのPL/I:ON ENDFILEによるファイル制御の極意

やあ。今日もレガシーシステムの荒波と格闘している諸君、お疲れ様。
メインフレームのバッチ処理において、ファイル読み込みの制御は「プログラムの背骨」だ。ここを適当に書くと、本番稼働後の夜間バッチで突然の異常終了(ABEND)を招き、翌朝の運用担当者が顔を青くすることになる。

今日は、PL/Iにおける`ON ENDFILE`の正しい作法と、トラブルを未然に防ぐための制御フローについて、現場の知見を交えて伝授しよう。

1. プログラムの基本骨格とONユニットの配置

まず大前提として、PL/Iのプログラムは`PACKAGE`で括り、`PROCEDURE OPTIONS(MAIN)`でエントリーポイントを定義するのが現代の標準だ。`ON ENDFILE`は、ファイルを開く前、あるいは`PROCEDURE`の宣言部直後に配置するのが鉄則である。

なぜなら、`ON`ユニットは宣言されたスコープ内で有効になるからだ。もし処理の途中で動的に`ON`ユニットを書き換えるようなトリッキーなことをすると、後でバグの温床になる。

1
TESTPROG: PACKAGE;

/ メイン処理部 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

DCL INFILE FILE RECORD INPUT;
DCL EOF_FLAG BIT(1) INIT(‘0’B);

/ ENDFILE発生時の挙動を定義 /
ON ENDFILE(INFILE) BEGIN;
EOF_FLAG = ‘1’B; / フラグを立ててループを脱出させる /
END;

OPEN FILE(INFILE);

/ ファイル読み込みループ /
READ FILE(INFILE) INTO(INPUT_RECORD);
DO WHILE(^EOF_FLAG);
/ ここにレコード処理ロジックを記述 /
CALL PROCESS_DATA(INPUT_RECORD);

READ FILE(INFILE) INTO(INPUT_RECORD);
END;

CLOSE FILE(INFILE);
PUT SKIP LIST(‘処理正常終了’);

END MAIN_PROC;
END TESTPROG;

2. ONユニットの「ネスト」と優先順位の罠

実務で稀に遭遇するのが、`BEGIN`ブロック内でさらに`ON`ユニットを定義してしまうケースだ。PL/Iの仕様では、「後から宣言された(内側の)ONユニットが優先される」というルールがある。

もしサブプロシージャや別の`BEGIN`ブロックで同じ条件の`ON`ユニットを再定義した場合、元の制御が上書きされる。これが原因で「なぜかファイル終了時に想定外の動作をする」という不具合が起きる。

現場の教訓:

  • ONユニットの多重定義は厳禁:基本はメインのPROCEDUREレベルで一元管理せよ。
  • REVERTの活用:もし局所的に動作を変える必要があれば、必ず`REVERT`文を使って元の定義に戻すこと。これを怠ると、メインループに戻った時に地獄を見る。

3. VSAMアクセス時の注意点

VSAM(KSDSなど)を扱う際、`ENDFILE`はレコードの最後(End of Data)に達したときに発生する。ここで重要なのは、`ON ENDFILE`だけで全てを解決しようとしないことだ。

特に、`READ`文に`KEY`や`KEYTO`を指定している場合、レコードが見つからない場合は`ENDFILE`ではなく`KEYCONDITION`が発生する。`ON ENDFILE`を過信せず、`ON CONDITION(KEYCONDITION)`なども併用して、例外ケースを網羅的にハンドリングするのが「動くプログラム」を書くプロの技だ。

4. 最後に:デバッグのコツ

もし本番環境で「なぜかループが止まらない」あるいは「特定のファイルだけ制御が効かない」という事態に陥ったら、まずは以下の2点を確認してほしい。

1. DCLの属性:`FILE`属性が正しく宣言されているか。稀に`STREAM`と`RECORD`を混同して宣言し、予期せぬ動作を招くケースがある。
2. REWRITEとの併用:`READ`の後に`REWRITE`を行う場合、ポインタの移動と`ENDFILE`のタイミングが直感とズレることがある。`SYSIN`や`SYSPRINT`で詳細なトレースログを吐き出し、どこでフラグが立っているかを確認する癖をつけろ。

PL/Iは古い言語と言われるが、その論理性と堅牢性は、数十年経った今でも最新の言語に決して引けを取らない。細部へのこだわりこそが、システムアーキテクトとしての信頼に直結する。

次の改修案件では、この「ONユニットの作法」を意識してコードを組んでみてくれ。応援しているぞ。

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