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

PL/Iの世界へようこそ!ON ENDFILEでファイル処理をスマートに制御しよう

メインフレームの世界に足を踏み入れた皆さん、ようこそ!JavaやCOBOLを経験されてきた方にとって、PL/Iは少し「独特なクセ」がある言語に見えるかもしれません。でも安心してください。PL/Iは、非常に柔軟で、かつ堅牢なプログラムを書くための強力な武器です。

今回は、基幹システムのバッチ処理で避けては通れない「ファイルの読み込み」と、その終了条件である「EOF(End Of File)」のハンドリングについて解説します。

1. PL/Iの基本構造:まずは枠組みを理解する

PL/Iのプログラムは、大きく分けて `PACKAGE`(プログラムの入れ物)と `PROCEDURE`(実際の処理内容)で構成されます。特にメインとなるプログラムには `OPTIONS(MAIN)` というおまじないをつけます。

1
/ プログラムの始まり /
MY_BATCH_PROG: PACKAGE;

/ メイン処理の手続き /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

/ ここに処理を書いていきます /

END MAIN_PROC;
END MY_BATCH_PROG;

COBOLでいうところの `PROGRAM-ID` や、Javaの `public static void main` のようなものだと捉えていただければOKです。

2. 「ONユニット」はPL/Iの魔法の引き出し

PL/Iが他の言語と大きく違う面白い点、それが「ONユニット」という概念です。

通常、ファイル読み込みのループ処理では「読み込み失敗=EOF」をその都度 `IF` 文で判定しますよね。しかしPL/Iでは、「ファイルが終わったら、勝手にこの処理を呼び出してね」という予約を事前に入れておくことができます。これが `ON ENDFILE` です。

なぜONユニットを使うのか?

メインの処理ロジックの中に、「もしファイルが終わったら…」という判定を何度も書くと、コードが複雑で見づらくなってしまいますよね。ONユニットを使えば、読み込みの正常ルートと、終了時の例外処理を完全に分離できるため、非常にスッキリとしたコードが書けるんです。

3. 実践コード:EOF検知の書き方

では、実際にファイルからレコードを読み込み、終了時に処理を抜けるコードを見てみましょう。ここでは `GOTO` を使った制御が一般的です。

1
READ_FILE_PROC: PROCEDURE OPTIONS(MAIN);

/ ファイルの定義(入力用) /
DCL IN_FILE FILE RECORD INPUT;
DCL EOF_FLAG BIT(1) INIT(‘0’B); / 終了フラグの初期化 /

/ ON ENDFILEユニットの定義:ファイルが終わったらここを実行 /
ON ENDFILE(IN_FILE) BEGIN;
EOF_FLAG = ‘1’B; / 終了フラグを立てる /
PUT SKIP LIST(‘ファイル読み込み完了!’);
END;

OPEN FILE(IN_FILE);

/ 読み込みループ /
DO WHILE (EOF_FLAG = ‘0’B);
READ FILE(IN_FILE) INTO(MY_RECORD);

IF (EOF_FLAG = ‘0’B) THEN DO;
/ ここにレコードごとの処理を書く /
PUT SKIP LIST(MY_RECORD);
END;
END;

CLOSE FILE(IN_FILE);

END READ_FILE_PROC;

4. 現場で役立つ「怖くない」ポイント

GOTOを恐れないで

Javaなどでは忌み嫌われる `GOTO` 文ですが、PL/IのONユニットにおいては「制御をメインループから安全に離脱させるため」の正当なツールです。`SIGNAL` を使ってあえて終了条件を発生させるテクニックも存在しますが、まずは上記の `FLAG` 管理か、特定のラベルへの `GOTO` から慣れていくのが一番の近道です。

データ宣言の不思議

`DCL`(DECLARE)で変数を宣言する際、`BIT(1)` や `CHAR(80)` といった属性が出てきます。これらはメモリ上の「定規」のようなものです。特に `BIT` 型は `1` か `0` しか入らないスイッチとして非常に優秀なので、フラグ管理には積極的に使ってみてください。

最後に一つだけアドバイス

メインフレームの現場では、「このONユニットはどこまで有効なのか?」というスコープ(有効範囲)がとても重要です。PROCEDUREを抜けるとONユニットの効力も消えます。もし処理中に予期せぬエラーでプログラムが止まってしまったら、まず「どこでONユニットが定義され、どこで上書きされているか」を追ってみてください。

PL/Iは歴史が長い分、多くの先人が残した「枯れた知恵」が詰まっています。一つずつ紐解いていけば、必ずあなたの強力な相棒になってくれますよ。応援しています!

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